【问题标题】:JS - Compare Objects with an additional IDJS - 比较具有附加 ID 的对象
【发布时间】:2021-06-16 09:00:47
【问题描述】:

我无法将以下对象与其他 ID 进行比较:

let id = 123
conterForCompareObjects = 0
conterForHitsValue2 = 0

value1: {
  '0': [999],
  '3': [123]
}
value2: {
  '0': {id: 999, something: "ABC"}, 
  '1': {id: 000, something: "DEF"},
  '2': {id: 123, something: "GHI"},
  '3': {id: 123, something: "JKL"}
}

我想计算两个不同的东西:

  1. 同一位置的 id 多久出现一次(在我的示例中,此对象中的数字为“3”(我希望是一个)
  2. value2 中的 id 多久出现一次(我希望是两个)。

有人可以帮助我,或者可以给我一个很好的提示,我该如何解决这个问题?我尝试使用过滤器,但我认为我做错了什么:

value1.filter( val1 => val1.includes(id))

然后我无法将其与 value2 进行比较:/

【问题讨论】:

  • value1.filter(val1 => val1.includes(id)) 然后我没有进一步将它与 value2 进行比较:/

标签: javascript object compare


【解决方案1】:

首先,filter 方法不能用于Object,它是Array 的属性。

请注意,以下是通用解决方案。它将保留所有键的计数。因此,根据您的需要使用或修改它。

  1. 同一位置的 id 多久出现一次(在我的示例中,此对象中的数字为“3”(我希望是一个)

命中数始终为 1,因为我们只检查 ID 是否存在于两个对象中。

let compareMap = new Map();
let conterForCompareObjects = new Map();

for(let postion in value1){
  let id = value1[position][0];
  compareMap.set(position, id);
}

for(let position in value2){
  let id1 = compareMap.get(position);
  if(id1 !== undefined){
   let id2 = value2[position]['id'];
    if(id2 === id1){
      conterForCompareObjects.set(id2, 1);
    } else conterForCompareObjects.set(id2, 0); // or don't, in that case it's `undefined`
  }
}

let someID = <SOME ID IN value2>
let hitForSomeID = conterForCompareObjects.get(someID);

  1. value2 中的 id 多久出现一次(我希望是两个)。
let conterForHitsValue2 = new Map();

for(let position in value2){
  let id = value2[position]['id'];
  let count = conterForHitsValue2.get(id);
  if(count === undefined){
    conterForHitsValue2.set(id, 0);
  } else {
    conterForHitsValue2.set(id, count + 1);
  }
}

let someID = <SOME ID IN value2>
let hitForSomeID = conterForHitsValue2.get(someID);

【讨论】:

  • 感谢您的回答和关于对象过滤器的提示;-)
  • @Beer-Hunter 几乎没有错误,我还重构了代码以使其更清晰。
猜你喜欢
  • 1970-01-01
  • 2012-10-07
  • 1970-01-01
  • 2020-07-23
  • 1970-01-01
  • 1970-01-01
  • 2022-07-14
  • 1970-01-01
相关资源
最近更新 更多