在javascript中,下面是我的开始数组:
[{
name: 'aaa',
value: 1
},
{
name: 'bbb',
value: 0
},
{
name: 'bbb',
value: 1
}]因此,我想将其转换为以下数组:
[{
name: 'aaa',
value: 1
},
{
name: 'bbb',
value: [0, 1]
}]我需要一个好的和简单的算法来做这件事
发布于 2011-11-28 19:44:37
这样如何:
var array = [{
name: 'aaa',
value: 1
},
{
name: 'bbb',
value: 0
},
{
name: 'bbb',
value: 1
}];
var map = {};
for(var i = 0; i < array.length; i++) {
var name = array[i].name;
if (map[name] === undefined) {
map[name] = [];
}
map[name].push(array[i].value);
}
var result = [];
for(var key in map) {
var value = map[key];
result.push({
name: key,
value: value.length === 1 ? value[0] : value
});
}最简单的方法是创建一个映射来跟踪使用了哪些名称。然后将此映射转换回对象数组。
如果要对value使用数组,则将其更改为:
result.push({
name: key,
value: value
});发布于 2011-11-28 19:42:41
下面是用于最简单实现的伪代码
hash = {}
for(pair in array) {
hash[pair.name] ||= []
hash[pair.name] << pair.value
}
result = []
for(k, v in hash) {
result << {name: k, value: v}
}发布于 2011-11-28 19:58:25
此函数可以实现此功能
function consolidate(var arrayOfObjects)
{
// create a dictionary of values first
var dict = {};
for(var i = 0; i < arrayOfObjects.length; i++)
{
var n = arrayOfObjects[i].name;
if (!dict[n])
{
dict[n] = [];
}
dict[n].push(arrayOfObjects[i].value);
}
// convert dictionary to array again
var result = [];
for(var key in dict)
{
result.push({
name: key,
value: dict[key].length == 1 ? dict[key][0] : dict[key]
});
}
return result;
}https://stackoverflow.com/questions/8295233
复制相似问题