使用JavaScript或jQuery比较数组

Wel*_*lli 1 javascript arrays jquery json object

我有两个数组,一个是这样的简单数组:

["Adrian", "Jhon"]
Run Code Online (Sandbox Code Playgroud)

另一个数组是我从jSon对象转换的对象数组.最初的jSon是这样的:

[
    {
        "Nome": "Jhon",
        "Departamento": "Test"
    },
    {
        "Nome": "Adrian",
        "Departamento": "Test"
    },
    {
        "Nome": "Jessy",
        "Departamento": "Test"
    }
]
Run Code Online (Sandbox Code Playgroud)

现在我需要比较第一个数组,第二个数组.如果Nome属性与我的第一个数组匹配,我将整个对象返回到另一个对象数组.

如何使用jQuery或纯JavaScript来保持第一个数组的顺序?

编辑 - 停止接受投票

我已经尝试过了:

jQuery.each(array, function (x) {
     novoRepo.push(jQuery.grep(repositorio, function (a) {
          return a.Nome == array[x];
     }));
});
Run Code Online (Sandbox Code Playgroud)

但我得到一个例外,说a.Nome是未定义的.

Ber*_*rgi 8

使用Array filter方法:

var search = ["Jhon","Adrian"],
    data = [
        {"Nome": "Jhon", "Departamento": "Test"},
        {"Nome": "Adrian", "Departamento": "Test"},
        {"Nome": "Jessy", "Departamento": "Test"}
    ];
var result = data.filter(function(obj) {
    return search.indexOf(obj.Nome) >= 0;
});
Run Code Online (Sandbox Code Playgroud)

对于那些浏览器不支持filterindexOf(尤其是IE <9),您可以到任一垫片,或使用jQuery的等价物$.grep$.inArray(见@ NULL的回答下面的显式代码).


为了保留search数组的顺序而不是数组的顺序data,您可以使用mapwhen对于每个搜索名称时,只有一个结果data:

result = search.map(function(name) {
    for (var i=0; i<data.length; i++)
        if (data[i].Nome == name)
            return data[i];
});
Run Code Online (Sandbox Code Playgroud)

如果每个名称都没有或多个结果,则最好使用concatMap:

result = Array.prototype.concat.apply(null, search.map(function(name) {
    return data.filter(function(obj) {
         return obj.Nome == name;
    });
});
Run Code Online (Sandbox Code Playgroud)

$.map自动解包数组:

result = $.map(search, function(name) {
    return $.grep(data, function(obj) {
         return obj.Nome == name;
    });
});
Run Code Online (Sandbox Code Playgroud)