【问题标题】:Given an array of objects, find the object with a particular key给定一个对象数组,找到具有特定键的对象
【发布时间】:2014-11-04 04:58:36
【问题描述】:

给定一个对象数组,在 JS 中找到具有特定键的对象的最佳方法是什么?

使用 jQuery 和 underscoreJS 很好。我只是在寻找最简单/代码最少的答案。

示例: 一个对象数组,其中每个对象都有一个“名称”。查找具有特定“名称”的对象。

var people = [{name: "A"}, {name: "B"}, {name: "C"}];

我目前的解决方案: 传入数组、键(例如“name”)和值(例如“C”)。

function getObject(myArray, searchKey, searchValue) {
  myArray.forEach(function(element){
    if (element[searchKey] == searchValue) {
      return element;
    }
  });
}

【问题讨论】:

  • 你可能想要filter
  • 可惜 ES6 还没有得到真正的支持:return arr.find(el => el[searchKey] === searchValue);
  • @Qantas94Heavy 它还在草稿中:(

标签: javascript jquery arrays underscore.js


【解决方案1】:

你可以使用Underscore.js的_.where函数,像这样

console.log(_.where(people, {
    "name": "C"
}));
# [ { name: 'C' } ]

这将返回数组中的所有对象,它与我们作为第二个参数传递的对象完全匹配。

【讨论】:

  • 谢谢@thefourtheye - 计时器到时我会接受答案。您是否也碰巧知道我如何从数组中删除它?看起来删除需要我知道数组中元素的索引。
  • @DonnyP 您可以使用_.filter,如其他答案所示,这将提供一个没有不需要元素的新数组。所以,我们可以抛弃旧数组,开始使用新数组。
【解决方案2】:

你应该使用 jQuery 的grep

var people = [{name: "A"}, {name: "B"}, {name: "C"}];

var obj1= jQuery.grep(people,function(n,i){return (n.name=='A')})

【讨论】:

    【解决方案3】:

    使用_.filter:

    var people = [{name: "A"}, {name: "B"}, {name: "C"}];
    
    var filteredPeople = _.filter(people, function(obj){
        return obj['name'] == 'C';
    });
    
    console.log(JSON.stringify(filteredPeople)) // [{"name":"C"}] 
    

    如果您想要一个没有匹配对象的数组,请使用_.reject

    var filteredPeople = _.reject(people, function(obj){
        return obj['name'] == 'C';
    });
    
    console.log(JSON.stringify(filteredPeople)) // [{name: "A"}, {name: "B"}]
    

    【讨论】:

    • filter 仅在您想要一个包含所有匹配项的数组时才适用。如果只找到一个匹配项,则应为 _.find
    【解决方案4】:

    没有任何自定义库你也可以做到这一点。请看下面的代码

    var people = [{name: "A"}, {name: "B"}, {name: "C"}],
        match=function(element){
          return element.name==="A";
        };
    console.log(people.filter(match));

    但它是一种静态代码。我不知道如何将键和值传递给 match() 函数。

    【讨论】:

      【解决方案5】:

      我很惊讶在这里没有找到明显的答案,所以:要使用 Underscore 做到这一点,您可以使用 _.find

      function getObject(myArray, searchKey, searchValue) {
          return _.find(myArray, function(entry) { return entry[seachKey] === searchValue; });
      }
      

      不过,您不需要下划线; JavaScript 的数组类型有 find(从 ES5 开始):

      function getObject(myArray, searchKey, searchValue) {
          return myArray.find(function(entry) { return entry[searchKey] === searchValue; });
      }
      

      从 ES2015+ 开始,您可以使用箭头函数和解构使其更简洁:

      function getObject(myArray, searchKey, searchValue) {
          return myArray.find(({[searchKey]: value}) => value === searchValue);
      }
      

      最后一个例子:

      function getObject(myArray, searchKey, searchValue) {
          return myArray.find(({[searchKey]: value}) => value === searchValue);
      }
      
      const people = [{name: "A"}, {name: "B"}, {name: "C"}];
      console.log(getObject(people, "name", "C"));

      【讨论】:

        猜你喜欢
        • 2015-09-16
        • 1970-01-01
        • 2017-02-07
        • 1970-01-01
        • 1970-01-01
        • 2021-12-12
        • 2020-08-28
        • 2021-07-03
        相关资源
        最近更新 更多