有一个包含一些对象的数组,它们可以包含具有相同标题(和不同类型)的元素。 应合并这些元素以获得具有唯一标题的结果数组,但不应丢失单个对象的信息。
所以这......
array = [
{ id: 1, title: 'one', type: 'infos' },
{ id: 2, title: 'two', type: 'infos' },
{ id: 3, title: 'same', type: 'infos' }, // <--
{ id: 1, title: 'oneDiff', type: 'article' },
{ id: 2, title: 'same', type: 'article' },
{ id: 3, title: 'three', type: 'article' } // <--
]
......应该得到:
distinct = [
{ id: 1, title: 'one', type: 'infos' },
{ id: 2, title: 'two', type: 'infos' },
{ id: 1, title: 'oneDiff', type: 'article' },
{ id: 3, title: 'three', type: 'article' },
{ id: [{ id: 3, type: 'infos'}, { id: 2, type: 'article'}], title: 'same', type: 'multiple' }
]
我试图从这开始,但我没有得到我需要的结果:
var unique = {};
var distinct = [];
for( var i in array ){
if( typeof(unique[array[i].title]) == "undefined"){
distinct.push(array[i].title);
}
unique[array[i].title] = 0;
}
答案 0 :(得分:0)
我有一个快速的想法。 为什么不将标题和类型连在一起,并将它们放在一个数组中? 所以,如果你有
title: 'apple'
type: 'golden'
然后你会用下划线将它们连接在一起以获得
apple_golden
当然,只有在任何标题或类型中都没有下划线时,这才有效。如果你这样做,你可以制作一个独特的字符组合,象征着一个新词的开头。
例如:
apple!-!-!golden
答案 1 :(得分:0)
我尝试用array.reduce来做。因此,如果你不支持ie8,你可以使用它。一个注意事项:如果没有额外的阵列,我无法做到。
var tempArray = [];
var result = array.reduce(function (memo, element) {
var index = tempArray.indexOf(element.title);
if (index === -1) {
tempArray.push(element.title);
memo.push(element);
} else {
if (typeof memo[index].id === 'number') {
memo[index].id = [{
id: memo[index].id,
type: memo[index].type
}];
memo[index].type = 'multiple';
}
memo[index].id.push({
id: element.id,
type: element.type
});
tempArray.push(null);
}
return memo;
}, []);