javascript - 通过嵌套数组进行过滤

标签 javascript arrays filtering

我有一个对象数组,其中一些键包含一个新数组。

现在我想返回具有特定值或属性内的嵌套数组包含特定值的所有对象。

数组看起来像是……。像这样:

const test = [
{
  test: 1,
  key: [{
    yes: true,
    no: null
  }]
}, 
{
  test: null,
  key: [{
    yes: true,
    no: null
  }]
}, 
{
  test: null,
  key: [{
    yes: null,
    no: null
  }]
}];

我想出的解决方案,不幸的是不起作用:

const Filtered = test.filter(obj => obj.test || obj.key.filter(item => item.yes));

所以实际上,只应返回前两个对象,但它返回全部三个。

我在这里缺少什么?

最佳答案

你差点就把它带回家了。使用 obj.key.some 或 obj.filter().length > 0 Array.prototype.filter 将始终返回一个数组。当没有与谓词匹配的项时,它将为空 (.length === 0)。

const test = [{
    test: 1,
    key: [{
      yes: true,
      no: null
    }]
  },
  {
    test: null,
    key: [{
      yes: true,
      no: null
    }]
  },
  {
    test: null,
    key: [{
      yes: null,
      no: null
    }]
  }
];

const filtered = test.filter(obj => obj.test || obj.key.filter(item => item.yes).length > 0)

console.log(filtered)

更“正确的方法”和“更高效的方法”是使用 Array.prototype.some ,因为它会在第一个“匹配”时在内部退出循环,而 filter 将循环遍历数组中的每个元素。

const predicate = obj => obj.test || obj.key.some(item => item.yes)

const filteres = test.filter(predicate)

关于javascript - 通过嵌套数组进行过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53005949/

相关文章:

javascript - 为什么原型(prototype)考虑对象而不是函数

javascript - JavaScript forEach 方法有什么用(map 做不到)?

matlab - matlab中的EEG带通滤波器

javascript - Canvas 不绘制图像

javascript - window.location.href 窗口未在 JavaScript 中定义

c# - 如何调用具有 bool 值 true unity C# 的数组元素

matlab - 如何使用 Matlab 绘制巴特沃斯滤波器的频率响应

python pandas groupby和过滤函数删除候选人姓名,无需两次预测

javascript - 设置 iFrame CSS 显示 :none during load

java - 将对象/数组从 JSON 解析为 Java