javascript - поиск строки в массиве объектов и возвращаемый массив - PullRequest
0 голосов
/ 19 сентября 2019

Я хотел бы написать функцию, которая будет искать поля объектов в массиве для конкретной строки, добавляя этот объект в новый массив, если строка найдена в любом из полей объекта.Я заставил свою функцию работать, но возникла проблема с новым списком, содержащим несколько копий объектов, которые содержат несколько копий искомой строки.Я знаю, что это потому, что я зациклил его, чтобы каждое поле, в котором он находил строку, добавляло объект еще раз в новый массив.Однако я не был уверен в том, каким альтернативным способом я мог бы написать функцию добавления объекта только один раз, независимо от того, сколько его полей совпало с искомой строкой.Это моя функция:

function search (keyword, array){
    var newArray = [];
    for(let i = 0; i < array.length; i++) {
        for (key in array[i]) {
            if(array[i][key].includes(keyword)){
                newArray.push(array[i]);
            }
        }
    }
    return newArray;
}

Пример, где вывод проблематичен, если я сделаю:

console.log(search('yes', myArray))

И если myArray содержит объект, в котором «да» появляется в 3различные поля, он добавит этот объект в newArray 3 раза.

Ответы [ 2 ]

1 голос
/ 19 сентября 2019

Улучшенная версия кода Дэнни Буонокора.

  • Нет случайных глобальных переменных.
  • Использует forEach для итерации по массиву.
  • Использует for ... из и Object.values ​​() для итерации по значениям объекта (используя for..in итерации по всем не-символьнымперечислимые свойства самого объекта и те, которые объект наследует от прототипа своего конструктора и являются причиной многих ошибок)
  • «короткое замыкание» тест для добавления объекта: если значение соответствует, нет необходимостипроверить другие значения.Одно это, вероятно, решило бы вашу проблему, но использование set предотвратит дублирование, если у вас есть один и тот же объект несколько раз в вашем массиве.

function search (keyword, array){
  var result = new Set();
  array.forEach( object => {
    for (const value of Object.values(object)) {
      if ( value.includes(keyword) ) {
        result.add(object);
        continue; // Don't need to check more on this item.
      }
    }
  });
  return Array.from(result);
}

console.log(search("yes", [
  { key1 :"yes", key2:"yes" },
  { key1 :"no", key2:"no" }
]));
1 голос
/ 19 сентября 2019

Вы можете использовать Set , это предотвратит дублирование.

function search (keyword, array){
    var result = new Set();
    for(let i = 0; i < array.length; i++) {
        for (key in array[i]) {
            if(array[i][key].includes(keyword)){
                result.add(array[i]);
            }
        }
    }
    return Array.from(result);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...