我有一个数组,它以下列格式包含很多对象:
var data = [
{
vs: "23434",
ip: "129.23.321.5"
},
{
vs: "23454",
ip: "129.23.321.6"
},
{
vs: "23434",
ip: "129.23.321.8"
}
];
现在我想以一种方式对它们进行排序,其中有一个数组以下列格式保存对象:
var dataFinal = [
{
vs: "23434",
ip: ["129.23.321.5", "129.23.321.8"]
}
{
vs: "98647",
ip: ["129.23.321.6"]
}
];
基本上,数据var中将有多个对象,其中可能存在多个ip,而我希望以一种数组将具有多个对象的方式对它们进行排序,每个对象各一个,但是ip将是另一个包含该vs的所有ip的数组。
在javascript中执行此操作的最佳方式是什么?
答案 0 :(得分:2)
我认为这是一种与特定语言无关的编程技术问题。
Javascript不提供" native"做这种任务的方法。你在评论中描述的方式完全没问题。如果您发现自己经常处理这类任务,可以使用某些第三方库(如underscore)来减少生物代码。
解决此问题的强硬方式:
function mergeVsUseUnderscore(data) {
var dataFinal = [],
vsInFinal;
_.each(data, function(item) {
vsInFinal = _.find(dataFinal, function(itemFinal) {
return itemFinal.vs === item.vs;
});
if(vsInFinal) {
vsInFinal.ip.push(item.ip);
} else {
dataFinal.push({
vs: item.vs,
ip: [item.ip]
})
}
});
return dataFinal;
}
还有一点需要注意,只需使用_.groupBy(data, 'vs')
即可生成:
{
'23434': [
{ vs: '23434', ip: '129.23.321.5' },
{ vs: '23434', ip: '129.23.321.8' }
],
'23454': [ { vs: '23454', ip: '129.23.321.6' } ]
}
答案 1 :(得分:1)
var data = [{
vs: "1",
ip: "129.23.321.6"
}, {
vs: "2",
ip: "129.23.321.8"
}, {
vs: "0",
ip: "129.23.321.5"
}, ];
var transformed = data.reduce(function (memo, datum) {
var filterFunc = function (_datum) {
return datum.vs === _datum.vs;
};
if (!memo.some(filterFunc)) {
memo.push({
vs: datum.vs,
ip: [datum.ip]
});
} else {
memo.filter(filterFunc)[0].ip.push(datum.ip)
}
return memo;
}, []);
var sorted = transformed.sort(function (a, b) {
if (a.vs > b.vs) {
return 1;
} else if (a.vs < b.vs) {
return -1;
} else {
return 0;
}
});
console.log(JSON.stringify(sorted));