如何使JSON数组独一无二

时间:2012-08-06 10:14:30

标签: javascript jquery arrays json dojo

  

可能重复:
  Array unique values
  Get unique results from JSON array using jQuery

我有一个像这样的JSON字符串

[
 Object { id="38",product="foo"},
 Object { id="38",product="foo"},
 Object { id="38",product="foo"},
 Object { id="39",product="bar"},
 Object { id="40",product="hello"},
 Object { id="40",product="hello"}

]

这个JSON数组中有重复的值。如何使这个JSON数组像这样

[
 Object { id="38",product="foo"},
 Object { id="39",product="bar"},
 Object { id="40",product="hello"}
]

。我正在寻找使用更少迭代的建议, Jquery $.inArray在这种情况下不起作用。

欢迎使用任何第三方库的建议。

5 个答案:

答案 0 :(得分:5)

您可以使用underscore's uniq

在您的情况下,您需要提供一个迭代器来提取'id':

array = _.uniq(array, true /* array already sorted */, function(item) {
  return item.id;
});

答案 1 :(得分:3)

// Assuming first that you had **_valid json_**
myList= [
    { "id":"38","product":"foo"},
    { "id":"38","product":"foo"},
    { "id":"38","product":"foo"},
    { "id":"39","product":"bar"},
    { "id":"40","product":"hello"},
    { "id":"40","product":"hello"}
];

// What you're essentially attempting to do is turn this **list of objects** into a **dictionary**.
var newDict = {}

for(var i=0; i<myList.length; i++) {
    newDict[myList[i]['id']] = myList[i]['product'];
}

// `newDict` is now:
console.log(newDict);

答案 2 :(得分:1)

在以下SO问题中检查解决方案:

Get unique results from JSON array using jQuery

您必须遍历数组并创建一个包含唯一值的新数组。

答案 3 :(得分:1)

您可以自己轻松编写代码。 我想到了这一点。

var filtered = $.map(originalArray, function(item) {
    if (filtered.indexOf(item) <= 0) {
        return item;
    }
});

或者建议一种更有效的算法专门用于手头的案例:

var helper = {};
var filtered = $.map(originalArray, function(val) {
    var id = val.id;

    if (!filtered[id]) {
        helper[id] = val;
        return val;
    }
});
helper = null;

答案 4 :(得分:1)

您可能需要循环删除重复项。如果存储的项目按照您的建议按顺序排列,则只需一个循环:

function removeDuplicates(arrayIn) {
    var arrayOut = [];
    for (var a=0; a < arrayIn.length; a++) {
        if (arrayOut[arrayOut.length-1] != arrayIn[a]) {
            arrayOut.push(arrayIn[a]);
        }
    }
    return arrayOut;
}