【问题标题】:Is there a function which returns true or false when searching for an object in an array of objects?在对象数组中搜索对象时,是否有返回 true 或 false 的函数?
【发布时间】:2017-01-30 19:26:33
【问题描述】:

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

我通过浏览 stackoverflow 找到的答案,如使用 jQuery.grepFind a value in an array of objects in JavascriptFind 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?

【问题讨论】:

  • !!arr.find(function(){...}); 怎么样?见Array.find()
  • @zero298 find() 方法返回数组中满足提供的测试函数的第一个元素的值。否则返回未定义。所以没有布尔结果
  • @zero298 作业的错误函数,如果正在寻找的实体具有虚假值,则会失败。
  • 我建议通读数组的文档以查看所有函数,因为确实没有那么多,而且将来会为您节省大量时间。

标签: javascript arrays


【解决方案1】:

Array.prototype.some 方法:

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

【讨论】:

    【解决方案2】:

    我在上面分享一个基于cmets的例子,它可能对其他人有帮助:

      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

    【讨论】:

      【解决方案3】:

      这对我有用:

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

      更新,更简单:

       ['cat', 'dog', 'bat'].includes('dog');  
      

      【讨论】:

        【解决方案4】:

        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;
            }
        

        【讨论】:

          【解决方案5】:

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

          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})

          【讨论】:

            猜你喜欢
            • 2018-08-25
            • 2019-02-09
            • 2020-11-28
            • 1970-01-01
            • 2023-03-31
            • 2015-06-29
            • 1970-01-01
            • 2015-07-06
            • 1970-01-01
            相关资源
            最近更新 更多