Получить ключи объекта, если значение объекта равно true и ключ находится в массиве. Javascript - PullRequest
0 голосов
/ 15 мая 2019

Рассмотрим следующий объект

let obj = {
   1:true,
   2:false,
   3:true
}

и некоторые значения, такие как let val = 1; или 2, что угодно.

Я хочу получить либо true, либо false

В нашем примере только для 1 и 3 он должен возвращать true. Я уже пробовал это решение, но когда я проверяю на 2, он все еще возвращает истину, когда он должен вернуть ложь

const isFavourited =
      (Object.keys(obj).some(id => val == id &&
        Object.values(obj).some(value => value == true))
      );

Ответы [ 5 ]

3 голосов
/ 15 мая 2019

Вы можете взять функцию, которая проверяет значение.

const check = k => object[k] === true;

var object = { 1: true, 2: false, 3: true };

console.log(check(1));
console.log(check(2));
0 голосов
/ 15 мая 2019
let obj = { 1:true, 2:false, 3:true };
//Create an temp object
let tempObj = {};

//Loop over keys and filter if key value is true and add to temp object
Object.keys(obj).filter((o)=> {if(obj[o]) tempObj[o] = obj[o]});

console.log(tempObj);
0 голосов
/ 15 мая 2019

Когда вы делаете следующее

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] с использованием неявного приведения к логическому .

0 голосов
/ 15 мая 2019

Функция массива возвращает true, если один из элементов проходит проверку.

Object.values(obj).some(value => value == true))

Когда вы проверяете здесь значение, вы не указываете идентификатор (предыдущая проверка для идентификатора является отдельной).Поэтому он проверяет все элементы массива, пока один не пройдет проверку (индекс 0 пройдет проверку).

Я рекомендую вместо этого использовать ответ Нины.

0 голосов
/ 15 мая 2019

let obj = {
   1:true,
   2:false,
   3:true
}

var val1 = 1,
    val2 = 2,
    val3 = 3,
    val4 = 4

function checkValue(key){
  return !!obj[key];
}
console.log(checkValue(val1));
console.log(checkValue(val2));
console.log(checkValue(val3));
console.log(checkValue(val4));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...