比较几个字段的javascript数组

时间:2013-10-12 12:42:22

标签: javascript arrays algorithm

我有两个数组(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
        }
     }
}

3 个答案:

答案 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]);
}

JSFiddle

答案 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);