【问题标题】:Check if an object exists in other objects' sub-objects within an array检查一个对象是否存在于数组中其他对象的子对象中
【发布时间】:2017-08-25 12:42:19
【问题描述】:

我有一个这样的数组:

array = [
     {
      a:0, 
      b:{x:1,y:2} 
     },
     {
      c:0,
      b:{x:3,y:2}},
    ]

我有一个像这样的新对象

{
 e:0, 
 b:{x:2,y:5}
}

我想测试array 中的对象是否有 same nested b object,如果是,我会将新对象推到那里,如果它已经存在,我将用较新的对象替换整个对象。 请帮助我如何实现这一点(Lodash,ES6 ..), 顺便说一句,我正在使用 Typescript。

【问题讨论】:

  • 尝试在jquery中使用extend - api.jquery.com/jquery.extend
  • 我没有使用 Jquery ^^,你可以在那里查看标签 谢谢。
  • @Amol B Lande $.extend 用于普通的对象,而不是数组

标签: javascript arrays typescript lodash


【解决方案1】:

您可以简单地将Array.prototype.some() 方法与您的数组一起使用来测试是否有任何匹配的b 对象与搜索的对象,您的代码将是:

function checkIfObjectExists(array, obj) {
  return array.some(function(element) {
    return (typeof obj.b === typeof element.b) && JSON.stringify(obj.b) === JSON.stringify(element.b);
  });
}

这是一个有效的 sn-p:

function checkIfObjectExists(array, obj) {
  return array.some(function(element) {
    return (typeof obj.b === typeof element.b) && JSON.stringify(obj.b) === JSON.stringify(element.b);
  });
}

array = [{
    a: 0,
    b: {
      x: 1,
      y: 2
    }
  },
  {
    c: 0,
    b: {
      x: 3,
      y: 2
    }
  },
];

var searched = {
  e: 0,
  b: {
    x: 2,
    y: 5
  }
};


//Check an existing userId
console.log(checkIfObjectExists(array, searched));

//Check a non existing userId
console.log(checkIfObjectExists(array, {
  a: 0,
  b: {
    x: 1,
    y: 2
  }
}));

【讨论】:

  • 对象通过reference进行比较。所以obj.b=== element.b 总是失败
  • 我编辑了 sn-p 并更改了 searched 子对象,使其与数组中第一个对象的子对象相同,然后运行但它显示 false ..
  • @hindmost 很好地指出,我更新了比较对象的字符串表示的答案。
  • 感谢您的顺利回答
【解决方案2】:

下面的 IsExists() 如果相同的对象已经存在则返回 true,如果相同的对象不存在则返回 false。

function IsExists(YourList,Object ) {
        var i;
        for (i = 0; i < YourList.length; i++) {
            if (YourList[i].c === Object .c && YourList[i].b === Object .b) {
                return true;
            }
        }

        return false;
    }

调用你的函数如下:

    var NewObject={
     e:0, 
     b:{x:2,y:5}
    }

if (!IsExists(array ,NewObject.b))
{
array .push(NewObject);
}

如果 IsExists(array ,NewObject.b) 返回 false 则将该对象推送到数组中

【讨论】:

  • @abuabu 试试看.. 这会有所帮助
  • 非常感谢,我会通过@chsdk 的回答,它看起来更流畅,没有循环,我不能支持你的,因为我没有足够的声誉..
猜你喜欢
  • 2020-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-26
  • 2017-09-17
  • 1970-01-01
相关资源
最近更新 更多