Ответ 1
Object.keys получает ключи от объекта, тогда вы можете отфильтровать ключи на основе значений
var obj = {1001: true, 1002: false};
var keys = Object.keys(obj);
var filtered = keys.filter(function(key) {
return obj[key]
});
Как вернуть имя ключа объекта только в том случае, если значение true?
Я использую подчеркивание, и единственное, что я вижу, - это как легко вернуть ключи, я хочу как можно больше избежать избыточных итераций:
пример:
Object {1001: true, 1002: false}
Я хочу массив с только 1001 в нем...
Object.keys получает ключи от объекта, тогда вы можете отфильтровать ключи на основе значений
var obj = {1001: true, 1002: false};
var keys = Object.keys(obj);
var filtered = keys.filter(function(key) {
return obj[key]
});
Существует еще одна альтернатива, которая может быть использована с библиотекой 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"]
Я надеюсь, что это поможет
Если вы пытаетесь объединить фильтрацию и итерацию над объектом, вы обычно после _.reduce
(итератор швейцарского армейского ножа):
var trues = _(obj).reduce(function(trues, v, k) {
if(v === true)
trues.push(k);
return trues;
}, [ ]);
Менее подробные:
return array.filter(item => {
return item.enabled === true;
});