【问题标题】:Filter object from array based on multiple nested values根据多个嵌套值从数组中过滤对象
【发布时间】:2025-12-03 08:45:02
【问题描述】:

基本上,我试图找出从数组中选择一项的最简洁的方法,前提是所有某些值都存在。

const filterValues = ['blue', '30cm', 'true'];

const products = [
{
  details: [
    { id: 1, value: 'red' },
    { id: 2, value: '30cm' },
    { id: 3, value: 'true' },
    { id: 4, value: '123432'}
  ],
  name: "Product 1"
},
{
  details: [
    { id: 5, value: 'blue' },
    { id: 6, value: '30cm' },
    { id: 7, value: 'true' },
    { id: 8, value: '98348'}
  ],
  name: "Product 2"
},
{
  details: [
    { id: 9, value: 'black' },
    { id: 10, value: '40cm' },
    { id: 11, value: 'false' },
    { id: 12, value: '578347'}
  ],
  name: "Product 3"
},
]

只有产品 2 包含所有过滤器值,所以我想返回该产品。

我试过了:

products.filter(p => {
  p.details.find(k => filterValues.includes(k.value));
})

但是如果任何值满足条件而不是所有值都包含,则返回。这是这里的主要问题。如果对象中仅存在数组中的所有这些值,我正在努力寻找一种过滤方法。

【问题讨论】:

  • 那么你到底在挣扎什么?问题是什么?听起来像一个简单的filterfind 函数,使用一些逻辑运算符并知道how to access and process nested objects, arrays or JSON
  • 到目前为止你有什么尝试?
  • 我记得当人们使用循环尝试这种东西时
  • @SebastianSimon 我添加了更多描述
  • 假设您在使用 filter 方法时遇到了困难。为什么你没有走很长的路并用 if 条件 @tcurtis 编写一个循环?

标签: javascript ecmascript-6 lodash


【解决方案1】:

使用Array#every

const filterValues = ['blue', '30cm', 'true'];

const products = [
{
  details: [
    { id: 1, value: 'red' },
    { id: 2, value: '30cm' },
    { id: 3, value: 'true' },
    { id: 4, value: '123432'}
  ],
  name: "Product 1"
},
{
  details: [
    { id: 5, value: 'blue' },
    { id: 6, value: '30cm' },
    { id: 7, value: 'true' },
    { id: 8, value: '98348'}
  ],
  name: "Product 2"
},
{
  details: [
    { id: 9, value: 'black' },
    { id: 10, value: '40cm' },
    { id: 11, value: 'false' },
    { id: 12, value: '578347'}
  ],
  name: "Product 3"
},
]

console.log(products.filter(p => filterValues.every(fv => p.details.map(d => d.value).includes(fv))));

【讨论】: