Когда вы делаете следующее
const isFavourited =
(Object.keys(obj).some(id => val == id &&
Object.values(obj).some(value => value == true))
);
Вы не проверяете, является ли значение определенного индекса true
или false
.Вот что на самом деле происходит, когда у вас есть val = 1
:
- первый
.some
будет перебирать все ключи val == id
будет true
для второго ключа, которыйозначает: Object.values(obj).some(value => value == true)
будет выполнено - возвращает
true
, поскольку существует хотя бы одно значение, равное true
во всем obj
,Результат этой операции не зависит от значения ключа - только от того, работает он или нет.
let obj = { 1:true, 2:false, 3:true }
let check = Object.values(obj).some(value => value == true)
console.log(check);
Итак, алгоритм проверяет, содержит ли obj
данный ключ и любое значение , равное true
, в отличие от значения для данный ключ является истинным.
Вам не нужно циклически перебирать объект, чтобы убедиться в этом - получение значения obj[val]
- это все, что вам нужно - если ключ val
нене существует, вы получите undefined
назад, в противном случае вы получите значение.Так что вам просто нужно проверить, вернулось ли вам возвращенное значение true
или нет:
let obj = { 1:true, 2:false, 3:true }
console.log(1, obj[1] == true);
console.log(2, obj[2] == true);
console.log(3, obj[3] == true);
console.log(42, obj[42] == true);
Это может быть дополнительно сокращено до !!obj[index]
с использованием неявного приведения к логическому .