javascript-在对象数组中搜索字符串并返回数组

时间:2019-09-18 21:56:54

标签: javascript arrays function object

我想编写一个函数,该函数将在数组中的对象字段中搜索特定的字符串,如果在对象的任何字段中找到该字符串,则将该对象添加到新数组中。我已经开始使用我的函数,但是出现了新列表的问题,该列表包含对象的多个副本,其中包含要搜索的字符串的多个副本。我知道这是因为我循环了它,以便它在每个字段中找到字符串,它将再次将对象添加到新数组中。但是,我不确定编写该函数仅添加一次对象的方法,无论它的多少字段与要搜索的字符串相匹配,我都无法确定。这是我的功能:

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 个答案:

答案 0 :(得分:1)

您可以使用Set,这样可以防止重复。

ID

答案 1 :(得分:1)

Danny Buonocore代码的改进版本。

  • 没有意外的全局变量。
  • 使用forEach遍历数组。
  • 使用for...ofObject.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" }
]));