2016-11-28 4 views
6

Допустим, у меня есть объектНабор ключей объектов ложной

filter: { 
    "ID": false, 
    "Name": true, 
    "Role": false, 
    "Sector": true, 
    "Code": false 
    } 

Я хочу, чтобы установить все ключи к ложным (сбросить их). Каков наилучший способ сделать это, я бы хотел избежать цикла с помощью foreach и прочее. Любой аккуратный один лайнер?

+0

спасибо , пожалуйста, напишите ответ! – chefcurry7

+0

Как насчет этого, 'filter: {}', если бы вы обработали 'filter' для того же самого? – Aruna

ответ

10

Использование lodash, mapValues грациозное, петля-свободный путь:

filter = { 
    "ID": false, 
    "Name": true, 
    "Role": false, 
    "Sector": true, 
    "Code": false 
}; 

filter = _.mapValues(filter,() => false); 

Если вы хотите сделайте это с помощью Underscore.js, есть эквивалент, но с немного другим именем:

filter = _.mapObject(filter,() => false); 

В любом случае, значение filter будет установлен:

{ ID: false, 
    Name: false, 
    Role: false, 
    Sector: false, 
    Code: false } 
+0

спасибо за это. один вопрос, если я хочу получить свойство, которое имеет значение «true» (только одно в любое время), как лучше всего это сделать? – chefcurry7

+0

Примеры данных утверждают, что только одно свойство является «истинным» за раз. Но независимо от того, сколько бы ни было, '_.keys (filter) .filter (k => filter [k])' даст вам быстрый массив всех ключей для значений, которые являются правдивыми. Вы можете использовать точную эквивалентность 'true', если хотите строго булевы. И вы всегда можете индексировать полученный массив, чтобы получить первый: '_.keys (filter) .filter (k => filter [k]) [0]'. Это возвращает 'undefined', если их нет. Извините за три экземпляра «фильтра» в этом выражении, но ваше имя переменной перегружает имя функции. –

+0

@ chefcurry7 Вам также может понравиться '_.find (_. Keys (filter), k => filter [k])'. Он работает аналогично, но немного короче. –

15

Ну вот один вкладыш с ванильным JS:

Object.keys(filter).forEach(v => filter[v] = false) 

Он действительно использует неявный цикл с помощью метода .forEach(), но вы должны были бы петли так или иначе (если вы не сбросите, заменив весь объект с жестко запрограммированным литералом объекта по умолчанию).

+2

Исправьте меня, если я ошибаюсь, но это невозможно сделать ** БЕЗ ** цикла. Не уверен, понимает ли это ОП. –

+0

@CarlEdwards, это прекрасный карл. Я не понимал, что функции стрелок были полезны. – chefcurry7

+0

Даже без функции стрелки он все еще довольно короткий, как в другом ответе. – nnnnnn

6

Если вы не используете ES6, вот его ES5-аналог.

Object.keys(filter).forEach(function(key, value) { 
    return filter[key] = false; 
}) 
0

Небольшая строка кода совместим со всеми браузерами:

for(var i in your_object) your_object[i] = false; 
1

hasOwnProperty необходимо использовать

`` `

for(var i in your_object) { 
    if (Object.hasOwnProperty.call(your_object, i)) { 
    your_object[i] = false; 
    } 
} 

` ``