JS — Сравнение объектов с дополнительным идентификатором

#javascript #object #compare

Вопрос:

Я больше не могу сравнивать следующие объекты с дополнительным идентификатором:

 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. Как часто идентификатор находится в одной и той же позиции (в моем примере это число » 3 » в этом объекте (я ожидаю одного)
  2. Как часто идентификатор находится в значении2 (я ожидаю два).

Может ли кто-нибудь помочь мне или дать мне хороший совет, как я могу решить эти проблемы? Я пробовал с фильтром, но мне кажется, что я делаю что-то не так:

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

и тогда мне больше нечего сравнивать с value2 :/

Комментарии:

1. значение 1.фильтр( val1 => val1.включает в себя(идентификатор)), а затем я больше не могу сравнивать его со значением 2 :/

Ответ №1:

Прежде всего, filter метод не может быть использован на an Object , это свойство an Array .

Пожалуйста, обратите внимание, что ниже приведено общее решение. Он будет вести учет всех ключей. Так что используйте его или модифицируйте в соответствии с вашими потребностями.

  1. Как часто идентификатор находится в одной и той же позиции (в моем примере это число » 3 » в этом объекте (я ожидаю одного)

Число попаданий всегда будет равно 1, так как мы проверяем только наличие идентификатора в обоих объектах.

 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. Как часто идентификатор находится в значении2 (я ожидаю два).
 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);
 

Комментарии:

1. спасибо за ваш ответ и подсказку с фильтром по объектам;-)

2. @Beer-Hunter Было несколько ошибок, и я также переработал код, чтобы сделать его более понятным.