1

这就是我的对象的样子(我无法控制它的格式):

[{
    "Country": "Spain",
    "info info1": 0.329235716,
    "info info2": 0.447683684,
    "info info3": 0.447683747
}, {
    "Country": "Chile",
    "info info1": 1.302673893,
    "info info2": 1.357820775,
    "info info3": 1.35626442
}, {
    "Country": "USA",
    "info info1": 7.78805016,
    "info info2": 26.59681951,
    "info info3": 9.200900779
}]

我需要为多个国家/地区保留数据,但更改国家/地区名称。还有一些国家我需要完全省略。

这是我一次咬掉的次数超过我一次咀嚼的次数之一,到目前为止我所做的工作只是轮胎旋转。

$.each(output_json, function() {
  $.each(this, function(k, v) {
    console.log(k);
  });
});

我试图以这种方式遍历它,但我只是得到键/值对,我不确定如何根据我在里面找到的内容删除整个条目。

有谁知道一个函数/库/jQuery 插件,它可以让我以我描述的方式快速操作对象?

4

7 回答 7

3

Underscore.js是用于所有事物数据的库。对您的数据有用的功能是;each拒绝groupBy

于 2012-04-04T21:25:33.953 回答
3

该死的,忘掉jQuery吧!这是一个纯 JavaScript 任务。

  • 要遍历 Array,请使用for (var i=0; i<array.length; i++), 遍历 Object 使用for (var i in object)
  • 要删除数组条目,请使用splice(). 要删除对象属性,请使用delete object[key];.
  • 要过滤数组,在现代 javascript 版本中,您可以filter()为每个条目使用回调函数;它创建一个新数组。对象没有这样的(本机)方法。

您可能会发现一些具有有用实用功能的库,例如下划线。但是要学JS,可能还是先用native方法做比较好。

于 2012-04-04T21:34:17.307 回答
2
$(output_json).each(function(i){
    if (this["Country"] == "USA") output_json.splice(i,1);
    else if (this["Country"] == "Spain") this["Country"] = "Brazil";
    else {
        var country = this;
        $(this).each(function(i){
            if (this["info info2"] == 1.302673893) {
                country.splice(i,1);
            } 
        });
    }
})

这就是代码的骨架——显然你可能有更好的方法来检测重命名、删除等。但是使用 splice 方法和方括号使这比使用 delete 更安全,并且比维护多个数组等更有效。

于 2012-04-04T21:57:22.650 回答
1

如果您不想直接编写代码来执行您想要的操作,您可以使用像underscore.js这样的库,它封装了许多方便的函数来操作集合。因此,在解析完 JSON 之后,您可以使用 reject() 过滤掉集合中的特定对象。

于 2012-04-04T21:26:42.820 回答
1

我相信以下代码大致可以满足您的要求。查看工作小提琴: http: //jsfiddle.net/pUhDR/3/ 顺便说一句,我同意@Gazler,您可以使用下划线库,它比这更高级且更易于阅读:

var countriesString = JSON.stringify([{
    "Country": "Spain",
    "info info1": 0.329235716,
    "info info2": 0.447683684,
    "info info3": 0.447683747
}, {
    "Country": "Chile",
    "info info1": 1.302673893,
    "info info2": 1.357820775,
    "info info3": 1.35626442
}, {
    "Country": "USA",
    "info info1": 7.78805016,
    "info info2": 26.59681951,
    "info info3": 9.200900779
}]);

var countries = JSON.parse(countriesString);

// create new array
var newCountriesArray = new Array();
// exclude some countries
var excludeCountries = new Object();
excludeCountries['Spain'] = true;
// rename some countries
var renameCountries = new Object();
renameCountries['USA'] = 'United States of America';

for (index in countries) {
    if (countries[index].Country in renameCountries) {
        countries[index].Country = renameCountries[countries[index].Country];
    }
    if (!(countries[index].Country in excludeCountries)) {
        newCountriesArray.push(countries[index]);
    }
}

alert(JSON.stringify(newCountriesArray));
于 2012-04-04T21:34:29.293 回答
0

您可以delete在数组上使用运算符并删除元素。

  1. 创建要删除的项目列表。在下面的情况下'智利'
  2. 遍历列表并删除项目

演示

代码:

var toRemove = [];
$.each(output_json, function(i) {
  $.each(this, function(k, v) {
    if (v == 'Chile') toRemove.push(i);
  });
});

//remove all marked
for (var i = 0; i < toRemove.length; i++) {
    delete output_json[toRemove[i]];
}
于 2012-04-04T21:36:41.813 回答
0

由于我们必须删除我们当前正在迭代的集合中的一些索引,我选择像这样反转迭代:

const fields = [{key: "entry1",},{key: "entry2",},{key: "entry3",},{key: "entry4",},{key: "entry5",},]

const arrToDelete = ['entry3', 'entry4']
for (let idx = fields.length - 1; idx >= 0; idx--) {
  if (arrToDelete.includes(fields[idx].key)){
    fields.splice(idx, 1);
  }
}
于 2022-02-18T10:03:15.280 回答