在搜索对象数组中的对象时是否有返回true或false的函数?

问题描述 投票:4回答:2

我正在寻找一种检查对象数组中是否存在对象的好方法。当所有键/值存在于该数组中的同一对象中时,预期结果为true。

我通过浏览stackoverflow找到的答案,如使用jQuery.grep或Find object by id in an array of JavaScript objectsFind a value in an array of objects in Javascript返回找到的对象。我正在寻找的是一个布尔结果(不是找到的对象)。

我知道我可以循环所有数组元素,然后比较每个值....等

但我的意思是,如果有一种方法可以使用这样的JS方法:

var listOfObjecs = [
	{id: 1, name: "Name 1", score: 11},
	{id: 2, name: "Name 2", score: 22},
	{id: 3, name: "Name 3", score: 33},
	{id: 4, name: "Name 4", score: 44},
	{id: 5, name: "Name 5", score: 55},
];

var isObjectExist = function(search){
  return listOfObjecs.filter(function(obj){
     if(obj.id===search.id && obj.name===search.name && obj.score===search.score){
          return true;
     }
     return false;
  });
}

console.log( isObjectExist({id: 3, name: "Name 3", score: 33}) );
//outputs the found object [{id: 3, name: "Name 3", score: 33}]

console.log( isObjectExist({id: 9, name: "Name 3", score: 33}) );
//outputs an empty object []

这是因为:

filter()方法创建一个新数组,其中包含所有传递由提供的函数实现的测试的元素。

如果没有本机JavaScript方法(返回true或false),如何更新isObjectExist()函数以返回true或false?

javascript arrays
2个回答
15
投票

Array.prototype.some方法:

some()方法检查数组中的任何元素是否通过测试(作为函数提供)。 some()方法对数组中存在的每个元素执行一次函数:如果找到函数返回true值的数组元素,some()返回true(并不检查其余值)


0
投票

我根据上面的评论分享了一个例子,它可以帮助其他人:

  const listOfObjecs = [
    { id: 1, name: "Name 1", score: 11 },
    { id: 3, name: "Name 3", score: 33 },
    { id: 2, name: "Name 2", score: 22 },
    { id: 3, name: "Name 3", score: 33 },
    { id: 4, name: "Name 4", score: 44 },
    { id: 5, name: "Name 5", score: 55 },
    { id: 3, name: "Name 3", score: 33 },
  ];
  const search1 = { id: 3, name: "Name 3", score: 33 };
  const search2 = { id: 9, name: "Name 3", score: 33 };

  // Using Array.prototype.some()
  const resSomeSearch1 = listOfObjecs.some(item => JSON.stringify(item) === JSON.stringify(search1));
  console.log(`resSome(search1): ${resSomeSearch1}`); // outputs: true
  const resSomeSearch2 = listOfObjecs.some(item => JSON.stringify(item) === JSON.stringify(search2));
  console.log(`resSome(search2): ${resSomeSearch2}`); // outputs: false

  // Using Array.prototype.filter()
  const resFilterSearch1 = !!listOfObjecs.filter(item => JSON.stringify(item) === JSON.stringify(search1)).length;
  console.log(`resFilter(search1): ${resFilterSearch1}`); // outputs: true
  const resFilterSearch2 = !!listOfObjecs.filter(item => JSON.stringify(item) === JSON.stringify(search2)).length;
  console.log(`resFilter(search2): ${resFilterSearch2}`); // outputs: false

  // Using Array.prototype.find()
  const resFindSearch1 = !!listOfObjecs.find(item => JSON.stringify(item) === JSON.stringify(search1));
  console.log(`resFind(search1): ${resFindSearch1}`); // outputs: true
  const resFindSearch2 = !!listOfObjecs.find(item => JSON.stringify(item) === JSON.stringify(search2));
  console.log(`resFind(search2): ${resFindSearch2}`); // outputs: false

-1
投票

试试这个:

!!arr.find(function(){...})
© www.soinside.com 2019 - 2024. All rights reserved.