Вернуть ключ объекта только в том случае, если значение истинно

Как вернуть имя ключа объекта только в том случае, если значение true?

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

пример:

Object {1001: true, 1002: false} 

Я хочу массив с только 1001 в нем...

Ответ 1

Object.keys получает ключи от объекта, тогда вы можете отфильтровать ключи на основе значений

var obj = {1001: true, 1002: false};

var keys = Object.keys(obj);

var filtered = keys.filter(function(key) {
    return obj[key]
});

FIDDLE

Ответ 2

Существует еще одна альтернатива, которая может быть использована с библиотекой Lodash, используя два метода:

  • _.pickBy - создает объект, состоящий из свойств объекта. Если нет дополнительного параметра (предикат), то все возвращаемые свойства будут иметь правдивые значения.
  • _.keys(object) - создает массив ключей из данного объекта

Поэтому в вашем примере это будет:

var obj = {1001: true, 1002: false};
var keys = _.keys(_.pickBy(obj));

// keys variable is ["1001"]

Используя библиотеку Underscore.js, это было бы очень похоже. Вам нужно использовать функции _.pick и _.keys. Единственное различие заключается в том, что _.pick должен иметь функцию предиката, которая является _.identity.

Таким образом, код будет выглядеть следующим образом:

var obj = {1001: true, 1002: false};
var keys = _.keys(_.pick(obj, _.identity));

// keys variable is ["1001"]

Я надеюсь, что это поможет

Ответ 3

Если вы пытаетесь объединить фильтрацию и итерацию над объектом, вы обычно после _.reduce (итератор швейцарского армейского ножа):

var trues = _(obj).reduce(function(trues, v, k) {
    if(v === true)
        trues.push(k);
    return trues;
}, [ ]);

Демо: http://jsfiddle.net/ambiguous/2et6T/

Ответ 4

Менее подробные:

return array.filter(item => {
    return item.enabled === true;
});