【问题标题】:Multiple-level Filtering in Javascript/JavascriptJavascript/Javascript 中的多级过滤
【发布时间】:2020-10-28 16:48:47
【问题描述】:

我有一个如下所示的数组:

var selection = ["14-3","19-5", "23-5", "40-8", "41-8"];

现在,我有两个数组:Array1 指的是上述数组中值的第一部分(在 hyptens 之前),例如 19、23 等。Array2 包含包含第二部分的值 - 5,8 等。

Array1 = ["23", "40"]
Array2 = ["5", "8"]

我想过滤选择数组:

  • 所有 Array2 值都不匹配的项目应返回
  • 对于任何 Array2 值匹配的项目,仅返回与 Array1 匹配的项目。

在上述情况下,过滤后的数组如下:

filteredSelection = ["14-3", "23-5", "40-8"]

我知道如何使用 .filter() 做一个简单的过滤器,它可以通过另一个数组过滤一个数组。但在这种情况下,我不知道要过滤这个。请帮忙。

【问题讨论】:

  • 如何包含14-3
  • 这是标准1。第二部分3不在Array2中。所有 Array2 值都不匹配的项目应返回
  • 对,我把它改成了 Javascript/Jquery。
  • 它仍然只是 Javascript。这里没有 jQuery。

标签: javascript


【解决方案1】:

您可以排除 array2 的值并包括 array1 的值。

var selection = ["14-3","19-5", "23-5", "40-8", "41-8"],
    array1 = ["23", "40"],
    array2 = ["5", "8"],
    result = selection.filter(s => {
        const [l, r] = s.split('-');
        return !array2.includes(r) || array1.includes(l);
    });

console.log(result);

【讨论】:

    【解决方案2】:

    你可以试试这个-

    const selection = ["14-3","19-5", "23-5", "40-8", "41-8"];
    const Array1 = ["23", "40"];
    const Array2 = ["5", "8"];
    
    const obj1 = Array1.reduce((acc, curr) => ({...acc, [curr]: 1}), {});
    const obj2 = Array2.reduce((acc, curr) => ({...acc, [curr]: 1}), {});
    
    const res = selection.filter(item => {
      const [left, right] = item.split('-');
      return obj1[left] || obj2[right] === undefined;
    });
    
    console.log(res);

    已将Array1Array2 转换为对象,以使其具有成本效益。如果您最初可以将Array1Array2 声明为对象,那就太好了。

    【讨论】:

    • 如果你追求效率,Set() 可能比对象更好。
    【解决方案3】:

    应该可以使用filter,只要你知道自己在做什么:

    const filteredSelection = selection.filter(el => {
    const [first, second] = el.split('-');
    return !Array2.includes(second) || Array1.includes(first);
    });
    

    【讨论】:

      猜你喜欢
      • 2013-08-03
      • 2020-10-25
      • 2020-11-15
      • 1970-01-01
      • 2021-05-24
      • 2023-03-08
      • 2017-12-18
      • 2016-12-09
      • 1970-01-01
      相关资源
      最近更新 更多