Javascript: 数据对象合并
Javascript: Data Object merging
我想知道是否有办法合并一个对象中具有相同元素的元素 属性。
我的意思是:
var dummy = {
data: [
{name: 'A', info: '1'},
{name: 'B', info: 'A'},
{name: 'C', info: '2'},
{name: 'A', info: '2'},
{name: 'B', info: '2'}
]
};
var expected_results = {
data: [
{name: 'A', info: '1,2'},
{name: 'B', info: 'A,2'},
{name: 'C', info: '2'}
]
}
//Todo if same name merge if not seperate
var plugin = {
unique: {
list: []
},
merge: function(params) {
var lists = plugin.unique.list;
lists.push(params[0]); //First always unique
$.each(params, function(index, item) {
if(index !== 0) {
$.each(lists, function(index, list) {
if(list.name === item.name) {
list.info += ',' + item.info;
} else {
lists.push(item);
}
})
}
})
return lists;
}
};
console.clear();
var list = plugin.merge(dummy.data);
console.log('result',list);
我想我已经接近了,但不太确定我的循环哪里出了问题...:(
老实说,如果您要按键分组,您最好使用对象而不是数组作为返回的数据结构。更容易操作。
function squish(dummy) {
// pass in an initial empty object
// if the key isn't there, create it and use an array
// as a value - push in the value
var out = dummy.data.reduce(function (p, c) {
if (!p[c.name]) p[c.name] = [];
p[c.name].push(c.info);
return p;
}, {});
// flatten the arrays for each key
Object.keys(out).forEach(function (el) {
out[el] = out[el].join(',');
});
// return the expected_result
return out;
}
squish(dummy);
输出
{
"A": "1,2",
"B": "A,2",
"C": "2"
}
但是,如果您真的想要一个对象数组,那也很简单:
function squish2(dummy) {
var out = dummy.data.reduce(function (p, c) {
if (!p[c.name]) p[c.name] = [];
p[c.name].push(c.info);
return p;
}, {});
return Object.keys(out).map(function (el) {
return { name: el, info: out[el].join(',') };
});
}
输出
[
{ "name": "A", "info": "1,2" },
{ "name": "B", "info": "A,2" },
{ "name": "C", "info": "2" }
]
我想知道是否有办法合并一个对象中具有相同元素的元素 属性。
我的意思是:
var dummy = {
data: [
{name: 'A', info: '1'},
{name: 'B', info: 'A'},
{name: 'C', info: '2'},
{name: 'A', info: '2'},
{name: 'B', info: '2'}
]
};
var expected_results = {
data: [
{name: 'A', info: '1,2'},
{name: 'B', info: 'A,2'},
{name: 'C', info: '2'}
]
}
//Todo if same name merge if not seperate
var plugin = {
unique: {
list: []
},
merge: function(params) {
var lists = plugin.unique.list;
lists.push(params[0]); //First always unique
$.each(params, function(index, item) {
if(index !== 0) {
$.each(lists, function(index, list) {
if(list.name === item.name) {
list.info += ',' + item.info;
} else {
lists.push(item);
}
})
}
})
return lists;
}
};
console.clear();
var list = plugin.merge(dummy.data);
console.log('result',list);
我想我已经接近了,但不太确定我的循环哪里出了问题...:(
老实说,如果您要按键分组,您最好使用对象而不是数组作为返回的数据结构。更容易操作。
function squish(dummy) {
// pass in an initial empty object
// if the key isn't there, create it and use an array
// as a value - push in the value
var out = dummy.data.reduce(function (p, c) {
if (!p[c.name]) p[c.name] = [];
p[c.name].push(c.info);
return p;
}, {});
// flatten the arrays for each key
Object.keys(out).forEach(function (el) {
out[el] = out[el].join(',');
});
// return the expected_result
return out;
}
squish(dummy);
输出
{
"A": "1,2",
"B": "A,2",
"C": "2"
}
但是,如果您真的想要一个对象数组,那也很简单:
function squish2(dummy) {
var out = dummy.data.reduce(function (p, c) {
if (!p[c.name]) p[c.name] = [];
p[c.name].push(c.info);
return p;
}, {});
return Object.keys(out).map(function (el) {
return { name: el, info: out[el].join(',') };
});
}
输出
[
{ "name": "A", "info": "1,2" },
{ "name": "B", "info": "A,2" },
{ "name": "C", "info": "2" }
]