【问题标题】:Comparing arrays with JavaScript or jQuery将数组与 JavaScript 或 jQuery 进行比较
【发布时间】:2013-06-25 12:57:07
【问题描述】:

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

["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 是未定义的。

【问题讨论】:

  • @Curt 正确形式:您是否已采取任何步骤尝试自己解决问题?我们希望看到这些,因为它可以帮助解决过程,并在它们不成功时阻止我们做同样的事情。
  • 这样的? jsfiddle.net/P975R我不明白这个问题:|
  • Your code works fine for me。我做了什么不同的事情?
  • 我忘了说,我需要像第一个数组一样保持顺序,这很重要。

标签: javascript jquery arrays json object


【解决方案1】:

使用Array filter method

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$.grep$.inArray(有关显式代码,请参阅下面的 @NULL 答案)。


要保留search 数组的顺序而不是data 数组的顺序,您可以使用map,因为对于每个搜索名称,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;
    });
});

或使用 $.map 自动解包数组:

result = $.map(search, function(name) {
    return $.grep(data, function(obj) {
         return obj.Nome == name;
    });
});

【讨论】:

  • 需要注意的一点,IE.indexOf() Array 函数
  • @mplungjan:不应该有任何区别,只有 for-loop 与本机 map/indexOf 与 jQuery 各自。但是,OP 似乎需要特殊命令,因此需要先循环 search
  • 我数过。无论如何,我的内循环似乎数到 6,除非我找到时离开
  • @mplungjan:哦,对了,因为indexOf 会在找到某些东西时停止,如果数据中确实存在许多搜索的名称,解决方案可能会更快。但是,算法复杂度是一样的。
【解决方案2】:

没有过滤器你可以这样做:

Live demo

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
  });
});

【讨论】:

  • 另外$(this) 看起来不对,只需使用this.Nomefunction(z,x) {} 然后x.Nome
  • 我喜欢你的小提琴。您允许 OP 与 json 对象保持相同的外观/感觉,并将编码保持在最低限度。干得好。
  • @NULL 请回复否决票 - 我正在修复我的代码,而你评论/否决了(假设你投了反对票)
【解决方案3】:

To extend @Bergi's answer

使用$.grep$.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;
});

【讨论】:

  • 是的,如果您确保包含 >= jQuery 1.2。
猜你喜欢
  • 1970-01-01
  • 2013-06-04
  • 1970-01-01
  • 2017-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-29
相关资源
最近更新 更多