过滤数组以获取重复值

时间:2013-07-03 12:40:26

标签: javascript jquery dhtml

我有一个对象数组,如下所示。第一段代码位于一个循环中,其中创建了多个“Item”对象并将其推送到数组上。

此处提供问题示例:http://jsfiddle.net/X6VML/
请注意如何更改文本框中的值会显示重复的项目。

 // class
 var Item = function(label, value) {
    this.Label = label;
    this.Value = value;
 };

 var obj = new Item("My Label", "My Value");

 // adds object onto array
 itemArray.push(obj);

我遇到的问题是数组可以包含重复的对象,我需要在将对象列表转换为表格之前将其过滤掉,如下所示:

  for (var i = 0; i < itemArray.length; i++) {
      $('.MyTable').append("<tr><td>" + itemArray[i].Label + "</td><td>" + itemArray[i].Value + "</td></tr>");
  }

我可以确定它是否与Value相同是重复的。如何根据数组中是否已存在Value来过滤对象列表?

非常感谢

4 个答案:

答案 0 :(得分:1)

只是不要在数组中添加重复的项目:

var item = new Item("My Label", "My Value1");

if(!$.grep(itemArray, function(obj) { return obj.Value == item.Value; }).length)
  itemArray.push(item);

如果"My Value1"中已存在值为itemArray的对象,则不要添加它。

答案 1 :(得分:0)

这段代码可以。在形成HTML之前修改itemArray。

var arr = {};
for ( var i=0; i < itemArray.length; i++ )
    arr[itemArray[i].Value] = itemArray[i];
itemArray = new Array();
for ( key in arr )
    itemArray.push(arr[key]);

答案 2 :(得分:0)

一个简单的解决方案是:

var temp = [];
$.each(itemArray, function(index, obj){
    var found = false;
    $.each(temp, function(tempI, tempObj){
        if(tempObj.Value == obj.Value){
            found = true;
            return false;
        }
    });

    if(!found){
        temp.push(obj);
    }
});

itemArray = temp;
console.log(itemArray);

以上只是遍历数组中的每个对象,并将其推送到临时数组(如果它尚未存在),最后用itemArray覆盖temp


您是否考虑过在添加阵列时消除重复项?像这样:

function UniqueItemList(){
    var items = [];

    this.push = function(item){
        for(var i=0; i<items.length; i++){
            if(items[i].Value == item.Value){
                return;
            }
        }
        items.push(item);
    };

    this.getList = function(){
        return items;
    }
}

var myList = new UniqueItemList();

myList.push(new Item('label1', 'value1'));
myList.push(new Item('label2', 'value2'));
myList.push(new Item('label1', 'value1'));
myList.push(new Item('label1', 'value1'));

console.log(myList.getList());

如果您尝试推送重复项目,则会被拒绝。

Demo - 此处它已集成到您的代码中。

答案 3 :(得分:0)

我有这个方便的实用功能:

function uniq(ary, key) {
    var seen = {};
    return ary.filter(function(elem) {
        var k = (key || String)(elem);
        return seen[k] === 1 ? 0 : (seen[k] = 1);
    })
}

其中key是一个从元素中获取比较键的函数。

适用于您的用例:

uniqueItems = uniq(itemArray, function(item) { return item.Value })