it-swarm.com.ru

Эффективный способ перебора массива объектов в javascript/node.js

Я определил объект 

var Person = function(name,age,group){
this.name = name,
this.age = age,
this.group = group
}

var ArrPerson = [];
ArrPerson.Push(new Person("john",12,"M1"));
ArrPerson.Push(new Person("sam",2,"M0"));

Теперь мне нужен эффективный механизм, чтобы определить, содержит ли массив объектов ArrPerson конкретное имя или нет?

Я знаю, что мы можем перебирать массив, используя for loop и check. Предполагая, что массив огромен, есть ли другой эффективный способ сделать это?

6
bharz629
  • использовать методы массива ES5, такие как карта, фильтр, уменьшение и т. д.
  • использовать для каждого
  • родной для цикла

Пример: методы фильтра, отображения, уменьшения и т.д. Выполняют итерацию по каждому элементу или объекту в массиве, 

ArrPerson.filter(function(item){
       console.log(item)
   });

forEach: также перебирает каждый элемент/объект в массиве 

 ArrPerson.forEach(function(key,value){
     console.log(key);
     console.log(value)
  })

На вопрос сказано огромное множество, так

native for loop работает намного быстрее, чем любой из вышеперечисленных, и длительность кэширования может увеличиться на несколько мс (миллисекунд).

https://jsperf.com/native-map-versus-array-looping

for(var i = 0, len = ArrPerson.length; i < len; i++){

}
4
Shushanth Pallegar

Вы можете использовать фильтр массива или найти методы

ArrPerson.find(p=>p.name=='john')
ArrPerson.filter(p=>p.name=='john')

Метод find выполняет поиск в массиве с самого начала и останавливается, когда находит один соответствующий элемент. В худшем случае, когда искомый элемент является последним в массиве или его нет, этот метод будет выполнять O (n). означает, что этот метод будет делать n проверок (n как длина массива), пока не остановится.

Метод фильтра всегда делает O(n), потому что каждый раз он будет искать весь массив, чтобы найти каждый элемент, который соответствует.

Хотя вы можете сделать что-то намного быстрее (теоретически), создав новую структуру данных. Пример:

var hashmap = new Map();
var ArrPerson = [];
ArrPerson.Push(new Person("john",12,"M1"));
hashmap.set("john",true);

Эта карта ES6 будет хранить индекс всего массива на основе имен, которые он содержит. И если вы хотите увидеть, содержит ли ваш массив имя, которое вы можете сделать:

hashmap.has('john')//true

Этот подход будет делать O (1). Только одна проверка на карте, чтобы увидеть, существует ли это имя в вашем массиве. Также вы можете отслеживать индексы массива внутри карты:

var index = ArrPerson.Push(new Person("john",12,"M1"));
var map_indexes = hashmap.get("john");
if(map_indexes){
  map_indexes.Push(index-1);
  hashmap.set("john",map_indexes);
}else{
  hashmap.set("john",[index-1]);
}
map_indexes = hashmap.get("john"); //an array containing the ArrPerson indexes of the people named john
//ArrPerson[map_indexes[0]] => a person named john
//ArrPerson[map_indexes[1]] => another person named john ...

При таком подходе вы можете не только определить, есть ли в массиве человек с определенным именем, но и найти весь объект с помощью O (1) . Учтите, что эта карта будет индексировать людей только по имени, если вам нужна другая критика, вам нужна другая карта. Также синхронизировать две структуры данных непросто (удаление одного элемента из массива также следует удалить с карты и т. д.)

В заключение, как всегда увеличение скорости заканчивается жертвой чего-то еще, памяти и сложности кода в нашем примере.

6
alex-rokabilis

Нечто подобное должно работать.

    var Person = function(name,age,group){
    this.name = name,
    this.age = age,
    this.group = group
    }

    var ArrPerson = [];
    ArrPerson.Push(new Person("john",12,"M1"));
    ArrPerson.Push(new Person("sam",2,"M0"));

    for(var key in ArrPerson){
        if(ArrPerson[key].name === 'john'){
        //do something
          alert(ArrPerson[key].name);
        }
        }

0
thatOneGuy

Учитывая, что вы хотите проверить все, и не предполагая никакой другой индексации, проблема по-прежнему в O (n). Вы можете использовать .filter () для фильтрации и возврата массива, где они удовлетворяют этому условию. Кроме того, вы можете индексировать, используя другую структуру данных по тому, что вы хотите искать.

var Person = function(name, age, group) {
  this.name = name,
    this.age = age,
    this.group = group
}

var ArrPerson = [];
ArrPerson.Push(new Person("john", 12, "M1"));
ArrPerson.Push(new Person("sam", 2, "M0"));

function findByName(arr, name) {
  return arr.filter(function(o) {
    return o.name == name;
  });
}

document.write(JSON.stringify(findByName(ArrPerson, "john")));

0
Goblinlord