1

我有一个对象数组,如下所示。第一段代码在一个循环中,其中创建了多个“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 相同的重复项。如何根据数组中是否已存在值来过滤对象列表?

非常感谢

4

4 回答 4

1

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

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

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

如果已经有一个带有 Value "My Value1"in的对象itemArray,就不要添加它。

于 2013-07-03T13:14:05.927 回答
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);

以上只是简单地遍历数组中的每个对象,如果它不存在,则将其推送到临时数组,最后itemArraytemp.


您是否考虑过在添加到数组时消除重复项?像这样的东西:

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());

如果您尝试推送重复的项目,它将被拒绝。

演示- 在这里它被集成到您的代码中。

于 2013-07-03T13:08:38.907 回答
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]);
于 2013-07-03T12:51:54.710 回答
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);
    })
}

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

应用于您的用例:

uniqueItems = uniq(itemArray, function(item) { return item.Value })
于 2013-07-03T13:10:40.073 回答