如何从javascript中删除数组中的重复对象?

时间:2016-12-30 11:56:08

标签: javascript lodash

在我的代码中,我创建了一个名为array1的数组。在这个数组中,我列出了多个对象。我想将array1对象值过滤为唯一,并需要将ID与其各自的值进行分组。我在这里添加了我的代码,

数组1

var array1 = [
            {
                value:"A",
                id:1
            },
            {
                value:"B",
                id:1
            },
            {
                value:"C",
                id:2
            },
            {
                value:"B",
                id:5
            },
            {
                value:"A",
                id:2
            },
            {
                value:"A",
                id:1
            }
        ];

我想要的结果,

[
            {
                group:"A",
                groupIds:[1, 2]
            },
            {
                group:"B",
                groupIds:[1, 5]
            },
            {
                group:"C",
                groupIds:[2]
            }
        ]

6 个答案:

答案 0 :(得分:4)

在普通的Javascript中,您可以使用哈希表和Array#indexOf来获取唯一值。

var array = [{ value: "A", id: 1 }, { value: "B", id: 1 }, { value: "C", id: 2 }, { value: "B", id: 5 }, { value: "A", id: 2 }, { value: "A", id: 1 }],
    grouped = array.reduce(function (hash) {
        return function (r, a) {
            if (!hash[a.value]) {
                hash[a.value] = { group: a.value, groupIds: [] };
                r.push(hash[a.value]);
            }
            if (hash[a.value].groupIds.indexOf(a.id) === -1) {
                hash[a.value].groupIds.push(a.id);
            }
            return r;
        };
    }(Object.create(null)), []);

console.log(grouped);
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 1 :(得分:2)

您可以使用library(stringi) library(purrr) df$zip_1 <- stri_trim_both(df$postal_code) %>% stri_match_last_regex("((?:[[:digit:]]{5}-[[:digit:]]{4})|(?:[[:digit:]]{4,5}))") %>% ifelse(nchar(.)==4, 0 %s+% ., .) %>% .[,2] df[,2:3] ## postal_code zip_1 ## 1 85016 85016 ## 2 20230 20230 ## 4 12207 12207 ## 5 3436 03436 ## 6 6901 06901 ## 8 412 108 <NA> ## 10 2132 02132 ## 11 37402 37402 ## 12 7625149 76251 ## 14 98501 98501 ## 15 94559 94559 ## 18 33566-1173 33566-1173 ## 19 10019 10019 ## 21 10963 10963 ## 22 3000 03000 ## 23 53406 53406 ## 24 85258 85258 ## 25 HP12 3PR <NA> ## 27 20164 20164 ## 28 55419 55419 按值对对象进行分组,并使用forEach()Set()中删除重复的ID

groupIds

答案 2 :(得分:1)

_.uniqBy(objects, function (object) {
  return object.id;
});

将会:)

答案 3 :(得分:0)

使用_.groupBy_.mapValues来迭代对象值

var res = _.chain(array1)
    .groupBy('value')
    .mapValues(function(val, key) {
        return {
            group: key,
            groupIds: _.chain(val).map('id').uniq().value()
        };
    })
    .values()
    .value();

答案 4 :(得分:0)

这是普通Javascript中的另一个。

var hash = {}
array1.forEach( function(e) { 
    hash[e.value] = hash[e.value] || []; 
    if (hash[e.value].indexOf(e.id) == -1) { hash[e.value].push(e.id) }
})
var result = Object.keys(hash).map( function(key) { 
    return { group: key, groupIds: hash[key] } 
})

答案 5 :(得分:0)

使用lodash:

_(array1)
  .uniqWith(_.isEqual)
  .groupBy('value')
  .map((v, k) => ({ group: k, groupIds: _.map(v, 'id')}))
  .value()
  • uniqWith()使用isEqual()删除重复项。您希望使用此方法,以便比较idvalue道具。
  • groupBy()创建一个对象,其键是value属性。由于初始数组中有三个唯一值,因此该对象应该有三个键。
  • map()将对象转回数组,并具有预期的groupgroupIds属性。