通过合并具有相同字段值的元素来获取abject数组的唯一元素

时间:2016-01-04 21:13:35

标签: javascript arrays distinct

有一个包含一些对象的数组,它们可以包含具有相同标题(和不同类型)的元素。 应合并这些元素以获得具有唯一标题的结果数组,但不应丢失单个对象的信息。

所以这......

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;
}

2 个答案:

答案 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;
}, []);

Example on jsbin