Я создаю новый массив из существующего (большой массив с 100 000 объектов). В новом массиве я хочу только те элементы, где значение "город" - это, например, Нью-Йорк.
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"}]
Что я делаю неправильно? Как я мог достичь своей цели?
Спасибо заранее, ребята!
Элементы не будут 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
отлично.
Вы можете использовать метод 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.
Из документации:
filter()
вызывает предоставленную функцию обратного вызова один раз для каждого элемента в массиве и создает новый массив из всех значений, для которых обратный вызов возвращает значение, которое приводит к истинному. callback вызывается только для индексов массива, которым присвоены значения; он не вызывается для индексов, которые были удалены или которые никогда не были присвоены значениям. Элементы массива, которые не проходят тест обратного вызова, просто пропускаются и не включаются в новый массив.