Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/474.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 基于属性的多数组求交_Javascript - Fatal编程技术网

Javascript 基于属性的多数组求交

Javascript 基于属性的多数组求交,javascript,Javascript,我想根据一个公共属性查找多个对象数组的公共元素。此外,如果一个元素出现多次,我希望生成的数组反映它在所有数组中出现的次数 我尝试了以下方法: var-arr=[ [ {名称:'kiwi',值:12}, {name:'apple',值:5}, {name:'apple',value:12}, {名称:'pizza',值:33}, {名称:'pizza',值:24}, {name:'fish',值:5}, {name:'milk',值:5}, {name:'banana',值:7}, {name:

我想根据一个公共属性查找多个对象数组的公共元素。此外,如果一个元素出现多次,我希望生成的数组反映它在所有数组中出现的次数

我尝试了以下方法:

var-arr=[
[
{名称:'kiwi',值:12},
{name:'apple',值:5},
{name:'apple',value:12},
{名称:'pizza',值:33},
{名称:'pizza',值:24},
{name:'fish',值:5},
{name:'milk',值:5},
{name:'banana',值:7},
{name:'orange',值:11},
],
[
{name:'taco',value:23},
{name:'pizza',value:78},
{name:'apple',value:12},
{名称:'pizza',值:33},
{名称:'pizza',值:24},
{name:'fish',值:5},
{name:'pie',值:1},
{名称:'蛋糕',值:3},
{name:'banana',值:7},
{name:'beef',value:123},
{name:'lime',值:72},
{名称:'pizza',值:34},
],
[
{name:'apple',value:12},
{名称:'pizza',值:33},
{名称:'pizza',值:24},
{name:'pizza',value:23},
{name:'fish',值:5},
{name:'banana',值:7},
{name:'banana',值:77},
]
];
函数findArraysWithCommonName(arr){
让数组=[…arr];
var result=arrays.shift().reduce(函数(res,v){
if(arrays.every)函数(a){
返回(a)过滤器(功能(e){
返回e.name==v.name
}).长度>0);
}))res.push(v);
返回res;
}, []);
返回结果;
}

log(findArraysWithCommonName(arr))
我首先将每个子数组转换为一个对象,该对象根据每个
名称的出现次数进行索引。然后,迭代创建的每个子对象,为每个关键点创建一个新对象,其值为组合对象上的最小值

最后,返回第一个数组的
.filter
,检查在该对象上迭代的名称的出现计数是否大于0,找到时将该计数减少1:

函数findArraysWithCommonName(arr){
常数[oneArr,…rest]=arr;
/*将每个子阵列转换为,例如:
{
"塔可":一,,
“披萨”:4,
“苹果”:1,
"鱼":一,,
"馅饼":一,,
...
*/
const countsByName=rest.map(
subar=>subar.reduce((a,{name})=>{
a[姓名]=(a[姓名]| | 0)+1;
返回a;
}, {})
);
/*将对象合并为仅包含每个属性最小值的对象,例如:
{
“苹果”:1,
“披萨”:3,
"鱼":一,,
“香蕉”:1
}
*/
const combined countsByName=countsByName.reduce((a,countObj)=>{
Object.entries(countObj.forEach)([key,val])=>{
countObj[key]=Math.min(a[key],val)| 0;
});
返回countObj;
});
console.log(combinedCountsByName);
返回oneArr.filter(({name})=>{
如果(combinedCountsByName[name]>0){
combinedCountsByName[名称]--;
返回true;
}
});
}
var arr=[
[
{名称:'kiwi',值:12},
{name:'apple',值:5},
{name:'apple',value:12},
{名称:'pizza',值:33},
{名称:'pizza',值:24},
{name:'fish',值:5},
{name:'milk',值:5},
{name:'banana',值:7},
{name:'orange',值:11},
],
[
{name:'taco',value:23},
{name:'pizza',value:78},
{name:'apple',value:12},
{名称:'pizza',值:33},
{名称:'pizza',值:24},
{name:'fish',值:5},
{name:'pie',值:1},
{名称:'蛋糕',值:3},
{name:'banana',值:7},
{name:'beef',value:123},
{name:'lime',值:72},
{名称:'pizza',值:34},
],
[
{name:'apple',value:12},
{名称:'pizza',值:33},
{名称:'pizza',值:24},
{name:'pizza',value:23},
{name:'fish',值:5},
{name:'banana',值:7},
{name:'banana',值:77},
]
];

log(findArraysWithCommonName(arr));
一种方法是构建一个映射,将一个对象与其在数组中的“计数”关联起来(即该对象在
arr
中发生的次数)

这可以通过
.reduce()
实现,其中通过
JSON.stringify(obj)将每个对象序列化为字符串
-此字符串是对应对象形状和状态的唯一编码,用作
,用于标识映射中此形式的对象。
用于查询和更新映射的“计数”值,用于
arr
中遇到的每个对象

构建映射后,按“count”值大于1的映射项筛选映射项

最后,对于任何筛选出的条目,通过
.map()
反序列化这些条目的对应键,以获得在原始
arr
中包含多个对象的对象数组

这一方法可以实施为:

<代码>var>var arr<<代码>var arr=[[{{{{{{{{{{{{{{{{{{{{名称:'基维'奇异维'、价值:12},{{{{{{{名名:'基维''奇异维维维'、价值:12},{{{{名名名名名:'苹果,价值:5},{名:'苹果,价值:5},,,{{名名名名名名:'苹果,苹果,价值:12},{{{苹果,价值:12},,,,{{{{{{{{{名名名名名名名名名名名:'苹果,值:苹果,价值:苹果,价值:12},价值:12},价值:12},,,,,,,{{{{{{{{{{{{名名名名名名名苹果,价值:12},价值:12},,{{},{name:'fish',value:5},{name:'pie',value:1},{name:'cake',value:3},{name:'banana',value:7},{name:'beef',value:123},{name:'lime',value:72},{name:'pizza',value:34},{name:'apple',value:12},{name:'pizza',value:33},{name:'pizza',value:24},{name:'pizza',value:23},{name:'fizza',value:5}香蕉,{name:'