【问题标题】:Filtering an object array with another array用另一个数组过滤一个对象数组
【发布时间】:2022-02-17 01:17:19
【问题描述】:

我遇到了过滤问题..

objArray 是需要过滤的数组。 selectedNames 是一个数组,其中包含我想在 objArray 中找到的值。 我需要从 selectedNames 的“名称”属性(一个数组)中获取具有一个或多个值的所有对象。

我想要得到的输出是:

let result = [{names:["A","B","C","D"]},
              {names:["A","B"]},
              {names:["A","D"]}
             ]

这是我的代码的简化版本:

let objArray = [{names:["A","B","C","D"]},
                {names:["C","D"]},
                {names:["C","D","E"]},
                {names:["A","B"]},
                {names:["A","D"]}
               ]

let selectedNames = ["A","B"]

result = this.objArray .filter(obj => {
   return this.selectedNames.includes(obj.names)
}


如果名称属性是单个值而不是数组,我的代码似乎可以正常工作。但我不知道如何让它在数组上工作。

欢迎任何帮助

【问题讨论】:

标签: javascript filtering


【解决方案1】:

你可以做这样的事情。根据 names 属性过滤数组,在 selectedNames 数组中包含 'some' 值。 ...

objArray.filter(obj => obj.names.some(name => selectedNames.includes(name)));

[编辑] 正如@RadicalTurnip 指出的那样,如果 selectedNames 太大,这将不会有效。我建议你使用一个对象。例

...
const selectedNamesMap = selectedNames.reduce((p,c) => ({...p, [c]: true}), {});
objArray.filter(obj => obj.names.some(name => selelectedNamesMap[name]));

矫枉过正,但如果数组真的很大(数百万个元素),那么你最好使用常规 for 循环而不是数组方法。

【讨论】:

    【解决方案2】:

    这个结果没有按比例放大,但我不知道有什么方法可以确保它是高性能的,除非您知道更多信息(比如名称已经排序)。话虽如此,您只是又漏掉了一条逻辑。

    result = this.objArray.filter(obj => {
      let toReturn = false;
      obj.names.forEach(name => {
        if (this.selectedNames.includes(name))
          toReturn = true;
        };
      };
      return toReturn;
    };
    

    【讨论】:

      猜你喜欢
      • 2021-05-14
      • 2018-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多