Создать новый массив из существующего только с элементами, которые содержат определенное значение

1

Я создаю новый массив из существующего (большой массив с 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"}]

Что я делаю неправильно? Как я мог достичь своей цели?

Спасибо заранее, ребята!

Теги:
arrays
key-value

2 ответа

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.

Из документации:

filter() вызывает предоставленную функцию обратного вызова один раз для каждого элемента в массиве и создает новый массив из всех значений, для которых обратный вызов возвращает значение, которое приводит к истинному. callback вызывается только для индексов массива, которым присвоены значения; он не вызывается для индексов, которые были удалены или которые никогда не были присвоены значениям. Элементы массива, которые не проходят тест обратного вызова, просто пропускаются и не включаются в новый массив.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню