1

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

["Adrian", "Jhon"]

另一个数组是我从 json 对象转换而来的对象数组。原来的json是这样的:

[
    {
        "Nome": "Jhon",
        "Departamento": "Test"
    },
    {
        "Nome": "Adrian",
        "Departamento": "Test"
    },
    {
        "Nome": "Jessy",
        "Departamento": "Test"
    }
]

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

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

编辑 - 停止投票

我已经尝试过了:

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

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

4

3 回答 3

8

使用数组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;
});

对于那些不支持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];
});

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

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

或使用$.mapwhich 自动展开数组:

result = $.map(search, function(name) {
    return $.grep(data, function(obj) {
         return obj.Nome == name;
    });
});
于 2013-06-25T13:00:32.720 回答
4

如果没有过滤器,您可以这样做:

现场演示

var found = [];
$.each(["Jhon","Adrian"],function(i, name) {
  $.each(otherObject,function(j,obj) {
    if (obj.Nome==name) found.push(obj); // you could leave if only one of each
  });
});
于 2013-06-25T13:01:00.780 回答
2

扩展@Bergi的答案

使用$.grepand$.inArray看起来像这样:

var search = ["Jhon","Adrian"],
    data = [
        {"Nome": "Jhon", "Departamento": "Test"},
        {"Nome": "Adrian", "Departamento": "Test"},
        {"Nome": "Jessy", "Departamento": "Test"}
    ];
var result = $.grep(data, function(obj) {
    return $.inArray(obj.Nome, search) >= 0;
});
于 2013-06-25T13:06:59.040 回答