【问题标题】:How extract object by key/value from array using an other array如何使用其他数组从数组中按键/值提取对象
【发布时间】:2014-07-10 14:30:24
【问题描述】:

假设我们有两个这样的数组:

var array1 = [
    {"name":"foo", "age": 13},
    {"name":"bar", "age": 15},
    {"name":"foobar", "age": 9},

    {"name":"i", "age": 60},
    {"name":"want", "age": 41},
    {"name":"to", "age": 31},
    {"name":"extract", "age": 2},
    {"name":"all", "age": 34},
    {"name":"these", "age": 54}
];

var array2 = [
    {"name":"foo", "age": 13},
    {"name":"bar", "age": 15},
    {"name":"foobar", "age": 9}
];

我想从array1 中提取我在array2 中not 的所有对象,使用键name 作为参考。所以在治疗结束时,我想要数组:

var expectedResults = [
    {"name":"i", "age": 60},
    {"name":"want", "age": 41},
    {"name":"to", "age": 31},
    {"name":"extract", "age": 2},
    {"name":"all", "age": 34},
    {"name":"these", "age": 54}
}

有什么想法吗?我在 JS 中找不到似乎允许这种过滤器的方法。

【问题讨论】:

  • 只需循环遍历初始数组,并保留您需要的数组。
  • 我希望有更优雅的解决方案=/
  • " 我在 JS 中找不到似乎允许这种过滤器的方法。" 你知道...有时你实际上需要编写一些代码。
  • @kl94:这是最简单的方法。我建议你不要尝试做过早的优化,先让它工作。从你的问题中我得到的印象是你甚至还没有设法让它工作。
  • @cookiemonster 同意,但在其他一些语言中。你可以轻松做到

标签: javascript arrays filter


【解决方案1】:

你可以像这样从array2获取所有名字

var names = array2.map(function(currentObject) {
    return currentObject.name;
});

并根据收集到的names 过滤来自array1 的对象,就像这样

var result = array1.filter(function(currentObject) {
    return names.indexOf(currentObject.name) === -1;
});

console.log(result);

输出

[ { name: 'i', age: 60 },
  { name: 'want', age: 41 },
  { name: 'to', age: 31 },
  { name: 'extract', age: 2 },
  { name: 'all', age: 34 },
  { name: 'these', age: 54 } ]

因为你想让代码更短一点,你可以这样做

var result = array1.filter(function(currentObject) {
    return array2.every(function(currentArray2Object) {
        return currentArray2Object.name !== currentObject.name;
    })
});

但是如果数组很大,那么有效的解决方案是

var names = array2.reduce(function(result, currentObject) {
    result[currentObject.name] = currentObject.age;
    return result;
}, {});

var result = array1.filter(function(currentObject) {
    return !names.hasOwnProperty(currentObject.name);
});

console.log(result);

【讨论】:

  • 感谢您的回答,它完成了工作。但我真的认为有更好的方法来做这种工作。再次感谢。
  • @kl94 更好是指更短或更高效?
  • 我一直在寻找更短的解决方案,但我认为我们做不到。再次感谢您。
  • @kl94 我刚刚包含了一个替代版本,请检查。
  • @BenjaminAnderson 谢谢 :-) 我还提供了一个高效的版本,请检查。
猜你喜欢
  • 2023-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-08
相关资源
最近更新 更多