我有两个数组(data和data_not_included)。这些数组中的每个数组都有attridutes id和name。我这样填写:
data[i] = {
name :products.models[i].get('name'),
id : products.models[i].get('id')
};
现在我想显示数据中不在data_not_included数组中的元素。例如,我有
data=[{name: Sugar}{id: 1},{name: Butter}{id: 2},{name: Cola}{id: 3}]
// and
data_nat_included = [{name: Sugar}{id: 1},{name: Butter}{id: 2}].
它应仅显示{name: Cola}{id: 3}
。
以下是我已经完成的事情:
for(var j=0;j<data_not_icluded.length;j++)
{
for(var i=0;i<data.length;i++)
{
if(data[i].id != data_not_icluded[j].id ){
//but this doesnt work for me it displayes a lot of element many times
}
}
}
答案 0 :(得分:1)
这两个答案渐渐变坏了。这意味着它们在不理想的时间内运行。换句话说,它们是解决问题的天真方法。这个问题在数据库领域中更为广为人知,其中连接操作是常见的。众所周知,连接的复杂性为O(log n * n + log m * m)
,其中n
是第一个表中元素的数量,m
是第二个表中元素的数量。这比其他示例O(n^2)
中提供的天真解决方案所需的操作更少。
但是,如果您对数据有更多了解,例如,我希望这些值是唯一的并且可以轻松地序列化为字符串,您甚至可以通过简单地创建哈希值来将复杂性降低到O(n + m)
。您想要比较的对象。这是如何做到的:
其中n
是第一个数组中元素的数量,m
是第二个数组中元素的数量。
var data = [{ name: "Sugar" },
{ id: 1 },
{ name: "Butter" },
{ id: 2 },
{ name: "Cola" },
{ id: 3 }];
var dataNatIncluded = [{ name: "Sugar" },
{ id: 1 },
{ name: "Butter" },
{ id: 2 }];
function join(a, b) {
var hashA = {}, hashB = {}, p, result = [];
function setter(hash) {
return function (element) { hash[JSON.stringify(element)] = element; };
}
a.forEach(setter(hashA));
b.forEach(setter(hashB));
for (p in hashB) delete hashA[p];
for (p in hashA) result.push(hashA[p]);
return result;
}
// [{ name: "Cola" }, { id: 3 }]
答案 1 :(得分:0)
一种简单的方法:
var vals = [];
for(var i=0;i<data.length;i++)
{
var found = false;
for(var j=0;j<data_nat.length;j++)
{
if(data[i].id == data_nat[j].id ){
found = true;
break;
}
}
if (!found) vals.push(data[i]);
}
答案 2 :(得分:0)
for(var j=0;j<data_not_icluded.length;j++) for(var i=0;i<data.length;i++) if(data[i].id != data_not_icluded[j].id )
想一想这是做什么的:对于任何未包含的对象,显示所有与当前未包含的对象id不同的对象。这将多次显示许多项目,它将显示“未包含”但在另一个位置的对象。
而是循环遍历data
,检查每个data_not_included
中是否包含它,并以其他方式显示:
dataloop: for (var i=0; i<data.length; i++) {
for (var j=0; j<data_not_included.length; j++)
if (data[i].id == data_not_icluded[j].id)
continue dataloop;
display(data[i]);
}
或者,使用一些iteration methods of Arrays:
data.filter(function(d) {
return data_not_included.every(function(n) {
return d.id != n.id;
});
}).each(display);