从基于单个属性的数组中获取唯一对象

时间:2013-12-09 20:44:19

标签: javascript jquery arrays object unique

假设我们有以下内容:

node[1].name = "apple";
node[1].color = "red";
node[2].name = "cherry";
node[2].color = "red";
node[3].name = "apple";
node[3].color = "green";
node[4].name = "orange";
node[4].color = "orange;

如果我使用jQuery.unique(节点),我将获得所有原始节点,因为它们都有不同的名称或颜色。我想要做的只是获取具有唯一名称的节点,该节点应该返回

node[1] (apple)
node[2] (cherry)
node[4] (orange)

它不应该返回3,因为它是相同的水果,即使我们有绿色和红色的苹果。

3 个答案:

答案 0 :(得分:7)

使用Array.filter和临时数组存储dup:

function filterByName(arr) {
  var f = []
  return arr.filter(function(n) {
    return f.indexOf(n.name) == -1 && f.push(n.name)
  })
}

演示:http://jsfiddle.net/mbest/D6aLV/6/

答案 1 :(得分:2)

这种方法(来自@ David's)应该对大型输入有更好的性能(因为object[]O(1))。

function filter(arr, attribute) {
  var out = [],
      seen = {}

  return arr.filter(function(n) {
      return (seen[n[attribute]] == undefined) 
              && (seen[n[attribute]] = 1);
  })
}

console.log(filter(node, 'name'));

http://jsfiddle.net/LEBBB/1/

答案 2 :(得分:0)

这样做怎么样?

var fruitNames = [];
$.each($.unique(fruits), function(i, fruit) {
    if (fruitNames.indexOf(fruit.name) == -1) {
        fruitNames.push(fruit.name);
        $('#output').append('<div>' + fruit.name + '</div>');
    }
});

Here is a working fiddle

显然,我可以将当​​前的水果添加到uniqueFruit []或其他东西而不是output.append。