仅使用包含特定值的元素从现有数组创建新数组

时间:2017-06-05 10:39:46

标签: javascript arrays key-value

我从现有的(具有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"}]

我做错了什么?我怎样才能实现目标?

先谢谢你们!

2 个答案:

答案 0 :(得分:3)

元素不会是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 :(得分: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()为每个元素调用一次提供的回调函数   一个数组,并构造一个包含所有值的新数组   callback返回一个强制为true的值。调用回调   仅适用于已分配值的数组索引;它不是   为已删除或从未进行过的索引调用   指定值。不通过回调测试的数组元素   只是被跳过,并且不包含在新数组中。