如何通过传入字段集来搜索整个对象数组:javascript

问题描述 投票:0回答:2

当我想在作为数组传递给函数时跨某些字段进行搜索时,如何跨对象数组进行搜索。例如:

const src = [ { id:1, name: "name1", age: 25}, { id: 2, name: "name2", age: 33} ]

假设我只想搜索

name
age
等字段,而不是 id。我尝试过的代码

function contains(text, subStr) {
  return text.includes(subStr);
}

const searchInData = (searchString, searchData) => {
  const keyword = searchString.toLocaleLowerCase();
  let filteredData = searchData;
  if (keyword) {
    filteredData = searchData?.filter((item) => {
      const { name, age } = item;
      return (
        contains(name, keyword) ||
        contains(age, keyword) ||
      );
    });
  }
  return filteredData;
};

如何将字段名称作为数组传递并仅搜索这些值。比如,

searchInData(searchString, searchData, fieldsForSearch)

javascript arrays ecmascript-6 ecmascript-5
2个回答
0
投票

我创建了一个函数来完成我认为你想要的事情:

const src = [ { id:1, name: "name1", age: 25}, { id: 2, name: "name2", age: 33} ]


function filterObjArr(fieldArr, src)
{
    const result = src.reduce((acc, cur) =>
    {
      fieldArr.forEach(field =>
      {
        if(cur[field])
        {
          acc.push({[field]: cur[field]});
        }
      });
      
      return acc;
    },[]);
    
    return result;
}

let res = filterObjArr(['name', 'age'], src);

console.log(res);


0
投票

您可以迭代第三个参数中的键,并测试每个键是否具有该键名称的项目属性包含该字符串。您可以使用

some
来实现这一点。也许对参数使用剩余语法也很有趣:

function searchInData(searchString, searchData, ...fieldsForSearch) {
    const keyword = searchString.toLocaleLowerCase();
    // If no keys provided, search all of them
    if (fieldsForSearch.length == 0) {
        return searchData?.filter((item) =>
            Object.values(item).some(value => String(value).includes(keyword))
        );
    }
    // keys were provided: test those properties only
    return searchData?.filter((item) =>
        fieldsForSearch.some(field => Object.hasOwn(item, field) 
                                   && String(item[field]).includes(keyword))
    );
};

// demo
const src = [ { id:1, name: "name1", age: 25}, { id: 2, name: "name2", age: 33} ];

console.log(searchInData("name", src, "id", "age").length); // 0
console.log(searchInData("3", src, "id", "name").length); // 0
console.log(searchInData("3", src, "age", "name").length); // 1
console.log(searchInData("2", src, "age", "name").length); // 2
console.log(searchInData("u", src, "nonexisting key").length); // 0
console.log(searchInData("1", src).length); // 1

© www.soinside.com 2019 - 2024. All rights reserved.