首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >搜索/过滤JavaScript对象数组

搜索/过滤JavaScript对象数组
EN

Stack Overflow用户
提问于 2021-11-01 19:03:19
回答 3查看 1.6K关注 0票数 1

我正在尝试创建一个搜索/筛选函数,该函数允许用户过滤一个JS对象数组,该数组返回一个填充了匹配搜索查询的数据的数组。

我希望能够在一个查询中搜索多个属性,例如,如果我搜索HKG,它将返回所有3个对象,但是如果我搜索了HKG 12345,它将返回数组中的第一个对象。

另一个例子是,如果我要搜索8,它将从sumOfContainers属性返回数组中的前2个对象,与查询匹配,但如果我搜索了8 SAV,它将只返回第一个对象。

代码语言:javascript
复制
results = [];

objects = [
        {laneId:"12345", lane:"HKG-SAV", equipmentType:"20'STD", sumOfContainers: "8", baseline:"$1234", new:"$1234", newSaving:"$1234"},
        {laneId:"12346", lane:"HKG-FRA", equipmentType:"20'STD", sumOfContainers: "8", baseline:"$1234", new:"$1234", newSaving:"$1234"},
        {laneId:"12347", lane:"HKG-LAX", equipmentType:"20'STD", sumOfContainers: "9", baseline:"$1234", new:"$1234", newSaving:"$1234"},     
];

const Search = (toSearch) => {
 for(var i=0; i<objects.length; i++) {
   for(key in objects[i]) {
     if(objects[i][key].indexOf(toSearch)!=-1) {
       results.push(objects[i]);
     }
   }
  }
}

我的尝试的问题是它将返回重复的数据。我在网上看到了很多帖子,但我发现很难找到类似结果的帖子。

我正试图通过本机JavaScript来实现这一点。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-11-01 21:14:18

一些问题:

  • 会添加重复项,因为在添加对象之后,您将继续在同一对象中查找更多匹配项。因此,如果有任何其他键匹配,相同的对象将被添加两次

  • 当搜索包含一个空格时,您的描述说您希望将其作为多个搜索词的分隔符,但是您的代码绝不会像这样分割搜索参数。

  • 函数

中没有return语句

关键变量未用constletvar声明

我建议用filter来解决这个问题:这保证了您不会得到重复的。然后要求所有搜索词都有一个匹配项:为此,您可以使用splitevery。然后要求至少有一个与搜索词匹配的键:为此,可以使用some

不要用PascalCase来命名您的搜索函数,而是使用camelCase (所以是search而不是Search)。通常的做法是为构造函数/类名保留PascalCase。

代码语言:javascript
复制
const search = toSearch => {
 let terms = toSearch.split(" ");
 return objects.filter(object =>
   terms.every(term =>
     Object.values(object).some(value =>
       value.includes(term)
     )
   )
  );
}
票数 2
EN

Stack Overflow用户

发布于 2021-11-01 21:15:49

我想出了一个很糟糕的方法来达到问题中的条件。如果有人能使这段代码更加优化,那就太棒了。

代码语言:javascript
复制
  const search = () => {
      let toSearch = document.getElementById("search").value;
      let lanes = this.objects;
      let result = [];
      const filters = toSearch.split(" ");
      for(let i = 0; i <lanes.length; i++) {
        let search = "";
        let isMatched = true;
        for(let key in lanes[i]) {
            search += lanes[i][key] + " ";
        }
        filters.forEach(filter => {
          if(search.indexOf(filter) == -1) {
            isMatched = false;
            break;
          } 
        });
        if(isMatched) {
          result.push(lanes[i]);
        }
      }
      return result;
    }
票数 0
EN

Stack Overflow用户

发布于 2021-11-01 22:23:56

如果你不介意的话

代码语言:javascript
复制
const _ = require('lodash');

const objects = [
        {laneId:"12345", lane:"HKG-SAV", equipmentType:"20'STD", sumOfContainers: "8", baseline:"$1234", new:"$1234", newSaving:"$1234"},
        {laneId:"12346", lane:"HKG-FRA", equipmentType:"20'STD", sumOfContainers: "8", baseline:"$1234", new:"$1234", newSaving:"$1234"},
        {laneId:"12347", lane:"HKG-LAX", equipmentType:"20'STD", sumOfContainers: "9", baseline:"$1234", new:"$1234", newSaving:"$1234"},     
];

const mySearch = (arr, text) => {
  const includesValue = (word, obj) => _.some(obj, (value) => _.includes(value, word));
  const words = _.words(text); 
  return arr
    .filter((obj) => 
      words.every((word) => 
        includesValue(word, obj)
      )
    );
};

console.log(mySearch(objects, 'HKG 12345'));
// [{laneId: '12345', lane: 'HKG-SAV', equipmentType: "20'STD", sumOfContainers: '8', baseline: '$1234', new: '$1234', newSaving: '$1234' }]

console.log(mySearch(objects, '8'));
// [
//   {laneId:"12345", lane:"HKG-SAV", equipmentType:"20'STD", sumOfContainers: "8", baseline:"$1234", new:"$1234", newSaving:"$1234"},
//   {laneId:"12346", lane:"HKG-FRA", equipmentType:"20'STD", sumOfContainers: "8", baseline:"$1234", new:"$1234", newSaving:"$1234"},
// ]

console.log(mySearch(objects, '8 SAV'));
// [{laneId: '12345', lane: 'HKG-SAV', equipmentType: "20'STD", sumOfContainers: '8', baseline: '$1234', new: '$1234', newSaving: '$1234' }]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69801600

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档