我有一个如下的JSON数组
[
{"Name" : "Arrow",
"Year" : "2001"
},
{"Name" : "Arrow",
"Type" : "Action-Drama"
},
{ "Name" : "GOT",
"Type" : "Action-Drama"
}
]
并且我正在尝试将其转换为
[
{
"Name" : "Arrow",
"Year" : "2001",
"Type" : "Action-Drama",
},
{
"Name" : "GOT",
"Type" : "Action-Drama"
}
]
任何帮助,我们将不胜感激。
谢谢。
答案 0 :(得分:2)
您可以使用Array#reduce
方法。
let data = [{
"Name": "Arrow",
"Year": "2001"
},
{
"Name": "Arrow",
"Type": "Action-Drama"
},
{
"Name": "GOT",
"Type": "Action-Drama"
}
]
let res = data.reduce((obj, { Name, ...rest }) => {
// define property(key as Name) if not defined
obj[Name] = obj[Name] || { Name };
// copy rest properties to object
Object.assign(obj[Name], rest);
// return object reference
return obj;
// set initial value as epty object
}, {})
// or one liner solution
// let res = data.reduce((obj, { Name, ...rest }) => (obj[Name]={... obj[Name] || {Name}, ...rest },obj), {})
// now res holds an object where key id name
// get values as an array using Object.values method
console.log(Object.values(res))
使用传统的for循环,并带有一个附加对象,该对象使用Name
作为键来保留每个元素的引用。
let data = [{
"Name": "Arrow",
"Year": "2001"
},
{
"Name": "Arrow",
"Type": "Action-Drama"
},
{
"Name": "GOT",
"Type": "Action-Drama"
}
]
// initialize array for result
let res = [],
// an object for array value reference by name
ref = {};
// iterate over main array
for (let i = 0; i < data.length; i++) {
// check property defined in refeence object(Name)
// if not then define and pushj it to result array
if (!(data[i].Name in ref)) res.push(ref[data[i].Name] = {});
// copy propety to object
Object.assign(ref[data[i].Name], data[i]);
}
console.log(Object.values(res))
答案 1 :(得分:1)
您可以使用reduce()
和findIndex()
let data = [
{"Name" : "Arrow",
"Year" : "2001"
},
{"Name" : "Arrow",
"Type" : "Action-Drama"
},
{ "Name" : "GOT",
"Type" : "Action-Drama"
}
]
let res = data.reduce((ac,a) => {
let ind = ac.findIndex(x => x.Name === a.Name);
ind === -1 ? ac.push({...a}) : ac[ind] = {...ac[ind],...a};
return ac;
},[])
console.log(res)
答案 2 :(得分:0)
请尝试这个
var object1 = {
apple: 0,
banana: { weight: 52, price: 100 },
cherry: 97
};
var object2 = {
banana: { price: 200 },
durian: 100
};
// Merge object2 into object1, recursively
$.extend( true, object1, object2 );
console.log( JSON.stringify( object1 ) );
参考:
http://researchhubs.com/post/computing/javascript/merge-content-of-objects.html
答案 3 :(得分:0)
使用reduce
和Object.assign
合并数组中的项目:
const data = [{
"Name" : "Arrow",
"Year" : "2001"
}, {
"Name" : "Arrow",
"Type" : "Action-Drama"
}, {
"Name" : "GOT",
"Type" : "Action-Drama"
}];
function mergeByProp (prop, xs) {
return xs.reduce((acc, x) => {
if (!acc[x[prop]]) {
acc[x[prop]] = x;
} else {
acc[x[prop]] = Object.assign(acc[x[prop]], x);
}
return acc;
}, {});
}
function objToArr (obj) {
return Object.keys(obj).map(key => obj[key]);
}
console.log(objToArr(mergeByProp('Name', data)));