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

时间:2017-01-30 19:26:33

标签: javascript arrays

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

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

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

但我的意思是,如果有一种方法可以使用这样的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?

6 个答案:

答案 0 :(得分:12)

Array.prototype.some方法:

  

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

答案 1 :(得分:1)

find()方法返回满足提供的测试功能的数组中第一个元素的值。否则,返回未定义。因此没有布尔结果。

@AlaDejbali对他的帖子的评论。

让我们看一下这个数组:

var arr = [{
        name: "Ala",
        age: 20,
    },
    {
        name: "Jhon",
        age: 22,
    },
    {
        name: "Melissa",
        age: 12,
    },
];

当然,find()返回数组内部的整个对象,但这取决于您在find内部的实现函数,例如:

function findObject(arr, value) {
    if (Array.isArray(arr)) {
        return arr.find((value) => {
            return value.age === 20;
        });
    }
}

当我们这样调用此函数时:

console.log(findObject(arr, 20));

结果将为:

{name: "Ala", age: 20}

据我们所知undefined不是object,因此我们可以测试返回的结果:

function findObject(arr, value) {
    const element = arr.find((value) => {
        return value.age === 20;
    });
    return typeof element === "object" ? true : false;
}

或通过其他方式:

function findObject(arr, value) {
        const element = arr.find((value) => {
            return value.age === 20;
        });
        return typeof element === "undefined" ? false : true;
    }

答案 2 :(得分:1)

这对我有用:

const findInArray = (myArray, item) => {
 !!myArray.find((el) => el == item)
};

答案 3 :(得分: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

答案 4 :(得分:0)

如果对象存在于对象数组中,则返回布尔值。

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 object = { id: 3, name: "Name 3", score: 33 };
var booleanValue = listOfObjecs.filter((item) => 
                   item.id === object.id && 
                   item.name === object.name && 
                   item.score === object.score).length > 0
console.log({booleanValue})

答案 5 :(得分:-1)

尝试一下:

!!arr.find(function(){...})