我有一个对象数组,如下所示。第一段代码位于一个循环中,其中创建了多个“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来过滤对象列表?
非常感谢
答案 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 })