2012-08-06 118 views
3

可能重复:有一个JSON字符串像
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"} 
] 

.IM寻找使用较少的迭代建议, Jquery $.inArray没有在这种情况下工作。

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

+0

你想用相同的ID /产品组合或者只是用相同的ID删除元素? – davids 2012-08-06 10:18:39

+1

要做到这一点,最有效的方法是将数组转换为散列元素作为键。然后将哈希变成一个数组。应该给你'O(n)'。 – freakish 2012-08-06 10:21:29

+0

其实这与JSON无关;) – 2012-08-07 08:36:58

回答

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; 
+0

相当无效。在最坏的情况下,'O(n^2)'。 – freakish 2012-08-06 10:20:13

+0

如果返回的数据确实具有ID,那么当然带有ID键的哈希映射将是最有效的。 – 2012-08-06 10:22:35

+0

+1:没错。如果OP想要一个数组,那么他可以很容易地将'filtered'转换成一个数组。就计算复杂度而言,该解决方案应该是'O(n)',尽管使用至少两倍的内存。不过应该不会是个问题(无论如何,谁会把这么大的JSON发送给客户端?)。 – freakish 2012-08-06 10:27:42

5

您可以使用underscore's uniq

在你的情况,你需要提供一个迭代提取“ID”:通过删除重复项

array = _.uniq(array, true /* array already sorted */, function(item) { 
    return item.id; 
}); 
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; 
} 
3

首先假设你有有效的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"} 
] 

你是什么基本上试图做的是将这个对象列表变成字典

var newDict = {} 

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

newDict现在是:

{ 
    '38': 'foo', 
    '39': 'bar', 
    '40': 'hello' 
} 
+0

如果您需要键值对中的数据,这很好。但是,如果您需要密钥,请为模板说明,这不是最佳解决方案。 – 2012-08-06 11:42:36