如何过滤数组中的重复对象

时间:2014-01-13 11:14:22

标签: javascript jquery underscore.js

我正在使用underscore.js插件来获取此代码 我在这里试过 jsfiddle

var basket=[{
            "basketitems":[{"items":[]}],
            "itemdetails":[{
                "amountPledged": "100",
                "bActivity": "Handloom Work",
                "bCity": "Nadia"
                },
                {
                "amountPledged": "100",
                "bActivity": "Saree Business",
                "bCity": "Nadia"
                },
                {
                "amountPledged": "100",
                "bActivity": "Saree Business",
                "bCity": "Nadia"
                }],
            "cartdetails":[],
            "paymentdetails":[],
            "userdetails":[]    
            }];

var tempbasket=_.uniq(basket);
document.body.innerHTML = JSON.stringify(tempbasket);

帮我解决这个问题

5 个答案:

答案 0 :(得分:3)

例如,

basket[0].itemdetails = _.uniq(basket[0].itemdetails, JSON.stringify)

http://jsfiddle.net/g5TD9/3/

要按特定字段过滤,请传递一个接受对象并返回该字段的函数:

_.uniq(itemdetails, function(x) { return x.bCity })

文档:uniq

答案 1 :(得分:1)

有两件事:

1。首先,你应该这样做:

basket[0].itemdetails=_.uniq(basket[0].itemdetails);
document.body.innerHTML = JSON.stringify(basket);

不是:

var tempbasket=_.uniq(basket);
document.body.innerHTML = JSON.stringify(tempbasket);

2。第二件事是,因为您的basket[0].itemdetails是对象数组,所以_.unique将不会在那里工作。在javascript中,两个不同的对象不能相等。

示例:

var x = {a:5};
var y = {a:5};

console.log(x == y); // false;

所以,这个技巧在这里不起作用。您必须手动执行此操作。祝你好运!

=====编辑=====

这是工作解决方案:

basket[0].itemdetails = _.unique(basket[0].itemdetails, function(item,key,a){
    return item.bActivity;
});

console.log(basket[0].itemdetails);

jsfiddle:http://jsfiddle.net/F4Q4u/3/

享受JScripting !!

答案 2 :(得分:0)

var tempbasket=_.uniq(basket[0].itemdetails.map(function(d){return JSON.stringify(d)}));

答案 3 :(得分:0)

您可以复制现有的JSON并对其进行迭代以检查重复项。

var basketCopy = JSON.parse( JSON.stringify( basket ) );
basketCopy[0].itemdetails = [];
_.each(basket[0].itemdetails, function(item) {
    if(!_.findWhere(basketCopy[0].itemdetails, item)) {
        basketCopy[0].itemdetails.push(item);
    }
});
console.log(basketCopy); // Your unique itemdetails list

答案 4 :(得分:-1)

我自己从未使用下划线,但采取(不是那么)疯狂的猜测,它检查第一个indexOf项是否与其实际索引相同。因为JS将逻辑上相同的对象视为不同的对象,所以它也会将它们视为不同的对象。您可能必须编写自己的unique()函数来正确处理对象。