我从现有的(具有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"}]
我做错了什么?我怎样才能实现目标?
先谢谢你们!
答案 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的值。调用回调 仅适用于已分配值的数组索引;它不是 为已删除或从未进行过的索引调用 指定值。不通过回调测试的数组元素 只是被跳过,并且不包含在新数组中。