![](/img/trans.png)
[英]changing an array of javascript objects with a single key to an array that contains the objects' data
[英]JavaScript array of objects contains the same array data
我尝试将所有相同的数据值放入对象数组中。 这是我的意见:
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);
您可以使用Array#map
, Array#reduce
, Array#filter
, Set
和Set#has
映射data
并获取公共值。
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);
您可以使用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)
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);
使用数组中的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());
您可以在每个数据数组上使用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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.