#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"}
}
Я хотел бы сосчитать две разные вещи:
- Как часто идентификатор находится в одной и той же позиции (в моем примере это число » 3 » в этом объекте (я ожидаю одного)
- Как часто идентификатор находится в значении2 (я ожидаю два).
Может ли кто-нибудь помочь мне или дать мне хороший совет, как я могу решить эти проблемы? Я пробовал с фильтром, но мне кажется, что я делаю что-то не так:
value1.filter( val1 => val1.includes(id))
и тогда мне больше нечего сравнивать с value2 :/
Комментарии:
1. значение 1.фильтр( val1 => val1.включает в себя(идентификатор)), а затем я больше не могу сравнивать его со значением 2 :/
Ответ №1:
Прежде всего, filter
метод не может быть использован на an Object
, это свойство an Array
.
Пожалуйста, обратите внимание, что ниже приведено общее решение. Он будет вести учет всех ключей. Так что используйте его или модифицируйте в соответствии с вашими потребностями.
- Как часто идентификатор находится в одной и той же позиции (в моем примере это число » 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);
- Как часто идентификатор находится в значении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 Было несколько ошибок, и я также переработал код, чтобы сделать его более понятным.