我尝试将所有相同的数据值放入对象数组。这是我的输入:
var a = [{
name: "Foo",
id: "123",
data: ["65d4ze", "65h8914d"]
},
{
name: "Bar",
id: "321",
data: ["65d4ze", "894ver81"]
}
]
我需要这样的结果:
["65d4ze"]
我尝试在我的对象上循环以获取此输出,但是我完全迷路了……我不知道如何知道结果是否进入所有数据数组。
var a = [{
name: "Foo",
id: "123",
data: ["65d4ze", "65h8914d"]
},
{
name: "Bar",
id: "321",
data: ["65d4ze", "894ver81"]
}
],
b = [],
c = []
a.forEach(function(object) {
b.push(object.data.map(function(val) {
return val;
})
);
});
console.log(b);
答案 0 :(得分:12)
您可以映射data
并获得与Array#map
,Array#reduce
,Array#filter
,Set
和Set#has
的公共值。
var array = [{ name: "Foo", id: "123", data: ["65d4ze", "65h8914d"] }, { name: "Bar", id: "321", data: ["65d4ze", "894ver81"] }],
key = 'data',
common = array
.map(o => o[key])
.reduce((a, b) => b.filter(Set.prototype.has, new Set(a)));
console.log(common);
答案 1 :(得分:3)
您可以使用Array#filter
方法。通过使用Array#every
方法检查所有其他对象的属性(数组)中是否存在值来过滤第一个数组。
let res = a[0].data.filter(v => a.slice(1).every(a => a.data.includes(v)));
var a = [{
name: "Foo",
id: "123",
data: ["65d4ze", "65h8914d"]
},
{
name: "Bar",
id: "321",
data: ["65d4ze", "894ver81"]
}
];
let res = a[0].data.filter(v => a.slice(1).every(a => a.data.includes(v)));
console.log(res)
答案 2 :(得分:1)
var a = [{
name: "Foo",
id: "123",
data: ["65d4ze", "65h8914d"]
},
{
name: "Bar",
id: "321",
data: ["65d4ze", "894ver81"]
}
],
b = {};
a.forEach(function(i) {
i.data.forEach(function(j) {
if (!b.hasOwnProperty(j)) {
b[j] = 0;
}
b[j] = b[j] + 1;
});
});
c = []
for (var i in b) {
if (b.hasOwnProperty(i)) {
if (b[i] > 1) {
c.push(i)
}
}
}
console.log(c);
答案 3 :(得分:1)
在数组中使用flat
函数:
var a = [{
name: "Foo",
id: "123",
data: ["65d4ze", "65h8914d"]
},
{
name: "Bar",
id: "321",
data: ["65d4ze", "894ver81"]
}
],
b = [],
c = []
a.forEach(function(object) {
b.push(object.data.map(function(val) {
return val;
})
);
});
console.log(b.flat());
答案 4 :(得分:1)
您可以在每个数据数组上使用reduce
和concat
,并检查每个项目的计数。
最后,您检查数组中的所有对象是否都包含该项目,如果是,则将其返回。
请注意,如果您要提取在数组中所有对象中都出现相同项目的项目,则此函数有效。
如果某项重复项,但不满足上述条件,则不会将其提取。
let a = [{name: "Foo",id: "123",data: ["65d4ze", "65h8914d"]},{name: "Bar",id: "321",data: ["65d4ze", "894ver81"]}]
let arr = a.reduce((prev,next) => prev.data.concat(next.data))
let counts = {};
let result = [];
for (var i = 0; i < arr.length; i++) {
var num = arr[i];
counts[num] = counts[num] ? counts[num] + 1 : 1;
}
for (let i in counts) {
if (counts[i] === a.length) {
result.push(i)
}
}
console.log(result)