从现有数组中创建一个只包含特定值元素的新数组

4

我从一个已有的数组中创建了一个新的数组(包含100,000个对象的大数组)。在新数组中,我只想要"city"值为纽约市的元素。

    var newData = [];

    for (var i = 0; i < data.length; i++) {

        if(data[i].city === "New York City") {

            newData[i] = {"city": data[i].city, "longitude": 
            data[i].longitude, "latitude": data[i].latitude, "state": 
            data[i].state};

        }
     }

我一定做错了什么,因为新数组中有很多元素是null...

然后新的数组看起来像这样:

[null,null,null,null,null, {"city":"New York", "logitude": 
-73.935242, "latitude": 40.730610, "state": "NY"},
null,null,null,null,null,null,"city":"New York", "logitude": 
-73.935242, "latitude": 40.730610, "state": "NY"}]

我做错了什么?如何实现我的目标?
谢谢大家提前帮忙!

1
为什么不使用filter - evolutionxbox
@evolutionxbox:看起来他们想要创建新的对象。 - T.J. Crowder
你可以尝试在if语句内使用console.log(data[i]),以查看输出的对象的哪一部分。除了null结果外,新数组是否包含所有正确的结果? - WizardCoder
2个回答

5

这些元素不会是null,它们将是缺失的(当您尝试访问它们时,出现undefined)。原因是每次都在增加i,即使跳过一个条目也是如此。

要修复它,请改用push

var newData = [];

for (var i = 0; i < data.length; i++) {

    if (data[i].city === "New York City") {
        newData.push({
            "city": data[i].city,
            "longitude": data[i].longitude,
            "latitude": data[i].latitude,
            "state": data[i].state
        });
    }
}

如果您希望这两个数组共享对象,您可以使用filter

var newData = data.filter(function(entry) {
    return entry.city === "New York City";
});

但是,如果你想要新的数组包含与原始对象不同的新对象,那么你的for循环就可以了。


1
我真是太瞎了...谢谢! - Unknown User

1
你可以使用 Array.prototype.filter 方法:
newData.filter(function (el) {
  return el.city === "New York City";
});

或者,如果您需要其他过滤器参数:
newData.filter(function (el) {
  return el.city === "New York City" && el.state === "NY" ;
});

这个方法是新的ECMAScript 5th Edition standard标准的一部分。

来自文档:

filter()会为数组中的每个元素调用一个提供的回调函数,并构造一个新的数组,其中包含所有回调返回一个强制转换为true的值的元素。只对已赋值的数组索引调用回调;未赋值或已删除的索引不会被调用。未通过回调测试的数组元素将被跳过,并且不包括在新数组中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接