Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 查找if对象';s数组具有使用Lodash的另一个数组中的元素_Javascript_Arrays_Lodash - Fatal编程技术网

Javascript 查找if对象';s数组具有使用Lodash的另一个数组中的元素

Javascript 查找if对象';s数组具有使用Lodash的另一个数组中的元素,javascript,arrays,lodash,Javascript,Arrays,Lodash,有一系列产品,每个产品的结构如下: { id: 1, name: "product 1", materials: [ { id: 1, name: "material 1" }, { id: 2, name: "material 2" }, { id: 3, name: "material 3" } ] } 每个产品都有一个包含不同数量材料的阵列 还有一个材质

有一系列产品,每个产品的结构如下:

{
  id: 1,
  name: "product 1",
  materials: [
    {
      id: 1,
      name: "material 1"
    },
    {
      id: 2,
      name: "material 2"
    },
    {
      id: 3,
      name: "material 3"
    }
  ]
}
每个产品都有一个包含不同数量材料的阵列

还有一个材质ID数组,例如
[1,4,7,2,5]

如何过滤产品阵列以仅保留产品,其中物料具有物料ID,而这些ID位于物料ID阵列中?

请尝试

products.filter(p=> p.materials.some(m=> materialsIds.includes(m.id)));
让materialsIds=[1,4,7,2,5];
让产品=[
{id:1,名称:“产品1”,材料:[{id:1,名称:“材料1”},{id:2,名称:“材料2”},{id:3,名称:“材料3”}]},
{id:2,名称:“产品2”,材料:[{id:2,名称:“材料2”}]},
{id:3,名称:“产品3”,材料:[{id:3,名称:“材料3”}],
]
设r=products.filter(p=>p.materials.some(m=>materialsIds.includes(m.id));
log('filteredproducts-id',r.map(p=>p.id));

log('filteredproducts',JSON.stringify(r))
您可以使用
filter()
some()
includes()

  • 在产品的主阵列上使用
    filter()
  • 然后在对象的
    材质上使用
    some()
  • 检查
    mats
    (物料id)是否包括物料的
    id
let arr=[{id:1,名称:“产品1”,材料:[{id:1,名称:“材料1”},{id:2,名称:“材料2”},{id:3,名称:“材料3”},{id:2,名称:“产品2”,材料:[{id:11,名称:“材料11”},{id:22,名称:“材料22”},{id:33,名称:“材料33”}
]
设mats=[1,5,6];
设res=arr.filter(x=>x.materials.some(z=>mats.includes(z.id));
console.log(res)
您可以执行以下操作:

import {intersection} from 'lodash'
const products = [...] 
const materialIds = [1,4,7,2,5]

// some function use es5+
const targetProducts = products.filter(p => intersection(p.materials.map(m => m.id), materialIds).length)

// use lodash only  import {filter, map, intersection} from 'lodash'
const targetProducts = filter(products, p => intersection(map(p.materials, 'id'), materialIds).length)
const产品=[
{
id:1,
名称:“产品1”,
材料:[
{
id:1,
名称:“材料1”
},
{
id:7,
名称:“材料7”
},
{
id:5,
名称:“材料5”
}
]
},
{
id:2,
名称:‘产品2’,
材料:[
{
id:1,
名称:“材料1”
},
{
id:2,
名称:“材料2”
},
{
id:3,
名称:“材料3”
}
]
}
];
常数材料=[3,4];
console.log(
products.filter(产品=>{
对于(设i=0;i);请显示您已尝试的内容。这里的目标是让其他人帮助修复您的代码,而不是为您编写所有代码。这不是一个复杂的过滤器,需要创建。是否有理由首先将对象映射到
id
字段的数组?map()是redundant@ziggywiggy不,我的方法不好。我修好了