【问题标题】:Is there a way to filter an array with specific number of returned items in JS?有没有办法在 JS 中过滤具有特定数量返回项目的数组?
【发布时间】:2021-03-10 01:46:45
【问题描述】:

例如,我只想得到两个满足过滤条件的项目。

filter() 然后 slice(2) 将迭代所有的项目,这真的很浪费,而 find() 只能返回一个项目。

有没有办法指定满足过滤条件的返回商品的数量?除了自己写for循环。

【问题讨论】:

  • 使用forEach,得到两个项目时抛出错误。

标签: javascript jquery reactjs filter ecma


【解决方案1】:

reduce 应该可以完成这项工作,请考虑以下示例

[1, 2, 3, 4].reduce((acc, n) => n > 2 ? [...acc, n] : acc, []) // results [3, 4]

【讨论】:

  • 虽然这个答案应该有效,但值得指出的是,这会遇到与使用 filter()map() 相同的“问题”,因为它还会遍历 OP 视为“”的整个数组浪费。”
  • 实际上,我不认为 JavaScript(及其变体)具有如此惰性的评估或短路机制。所以也许唯一不浪费的选择是for-loop。
  • 别误会,我对你的回答没有任何问题,我只是想提出一点,它可能会遇到 OP 的反对意见。就个人而言,虽然我接受一些额外的工作正在完成,但我会接受日后额外功能的“成本”(例如,想要找到最大值或最小值)。
  • 也许你是对的。我现在对要实现什么 OP 感到困惑,无论是性能优化还是语法重构。对于前者来说,这个答案正好违背了目的。
【解决方案2】:

你可以循环和中断。您可以创建一个辅助方法来执行此操作:

const found = [];
for (let i = 0; i < sourceArray.length; i++) {
   if (whatever) found.push(sourceArray[i];
   if (found.length >= 2) break;
}

【讨论】:

    【解决方案3】:

    我会编写一个辅助函数来接收您的数组、一个计数和一个谓词函数,类似于 array.filter 的工作方式。如果应包含该项目,则返回 true。

    function filterCount(array, count, predicate) {
      const elements = [];
    
      for (const el in array) {
        if (predicate(el)) {
          elements.push(el);
        }
        if (elements.length >= count) {
          break;
        }
      }
    
      return elements;
    }
    
    const test = [1,2,3,4,5,6,7,8,9,10];
    
    const onlyTwo = filterCount(test, 2, (number) => number >= 5);
    console.log(onlyTwo)

    【讨论】:

      猜你喜欢
      • 2021-09-11
      • 2021-08-25
      • 1970-01-01
      • 2020-04-24
      • 1970-01-01
      • 2021-07-29
      • 2022-06-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多