如何确定Javascript数组是否包含属性等于给定值的对象?

我有一个像

vendors = [
    {
      Name: 'Magenic',
      ID: 'ABC'
     },
    {
      Name: 'Microsoft',
      ID: 'DEF'
    } //and so on goes array... 
];

如何检查此数组以查看Magenic是否存在?除非必须,否则我不想循环播放。我正在处理几千条记录。


更新

由于这是一个受欢迎的帖子,所以我想分享一些新发现。看来@CAFxX已经分享了!我应该更经常阅读这些内容。我遇到了https://benfrain.com/understanding-native-javascript-array-methods/

vendors.filter(function(vendor){ return vendor.Name === "Magenic" })

借助ECMAScript 2015,使用新的箭头功能甚至更加简单:

vendors.filter(vendor => vendor.Name === "Magenic")
TomSam2020/03/12 10:32:14

var without2 = (arr, args) => arr.filter(v => v.id !== args.id); 例:

without2([{id:1},{id:1},{id:2}],{id:2})

结果:没有2([{{id:1},{id:1},{id:2}],{id:2})

長ぐつをはいたネコ2020/03/12 10:32:14

解决此问题的方法是使用ES6并创建一个为我们做检查的函数。此功能的好处是可以在整个项目中重用,以检查给定key和的对象数组value

够了,让我们看看代码

数组

const ceos = [
  {
    name: "Jeff Bezos",
    company: "Amazon"
  }, 
  {
    name: "Mark Zuckerberg",
    company: "Facebook"
  }, 
  {
    name: "Tim Cook",
    company: "Apple"
  }
];

功能

const arrayIncludesInObj = (arr, key, valueToCheck) => {
  let found = false;

  arr.some(value => {
    if (value[key] === valueToCheck) {
      found = true;
      return true; // this will break the loop once found
    }
  });

  return found;
}

通话/使用

const found = arrayIncludesInObj(ceos, "name", "Tim Cook"); // true

const found = arrayIncludesInObj(ceos, "name", "Tim Bezos"); // false
乐米亚2020/03/12 10:32:14
const a = [{one:2},{two:2},{two:4}]
const b = a.filter(val => "two" in val).length;
if (b) {
   ...
}
番长神无2020/03/12 10:32:14

或者,您可以执行以下操作:

const find = (key, needle) => return !!~vendors.findIndex(v => (v[key] === needle));
nick2020/03/12 10:32:14

您可以使用lodash如果lodash库对于您的应用程序来说太重了,请考虑分块出不必要的未使用功能。

let newArray = filter(_this.props.ArrayOne, function(item) {
                    return find(_this.props.ArrayTwo, {"speciesId": item.speciesId});
                });

这只是做到这一点的一种方法。另一个可以是:

var newArray=  [];
     _.filter(ArrayOne, function(item) {
                        return AllSpecies.forEach(function(cItem){
                            if (cItem.speciesId == item.speciesId){
                            newArray.push(item);
                          }
                        }) 
                    });

console.log(arr);

上面的例子也可以不用任何类似的库重写

var newArray=  [];
ArrayOne.filter(function(item) {
                return ArrayTwo.forEach(function(cItem){
                    if (cItem.speciesId == item.speciesId){
                    newArray.push(item);
                  }
                }) 
            });
console.log(arr);

希望我的回答有帮助。

飞云古一2020/03/12 10:32:13

如果您使用的是jquery,则可以利用grep来创建具有所有匹配对象的数组:

var results = $.grep(vendors, function (e) {
    return e.Name == "Magenic";
});

然后使用结果数组:

for (var i=0, l=results.length; i<l; i++) {
    console.log(results[i].ID);
}
马克2020/03/12 10:32:13

纠正我,如果我错了..我本可以使用这样的forEach方法,

var found=false;
vendors.forEach(function(item){
   if(item.name === "name"){
       found=true;
       return;
   }
});

如今我已经习惯了,因为它简单易懂。谢谢。

JinJin达蒙2020/03/12 10:32:13

由于OP询问了密钥是否存在的问题

可以使用ES6 reduce函数返回布尔值的更优雅的解决方案是

const magenicVendorExists =  vendors.reduce((accumulator, vendor) => (accumulator||vendor.Name === "Magenic"), false);

注意: reduce的初始参数是a false,如果数组具有键,它将返回true。

希望它有助于更​​好,更干净地执行代码