Установите для всех ключей объекта значение false

Допустим, у меня есть объект

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

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

Ответы

Ответ 1

Используя 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 }

Ответ 2

Ну вот один лайнер с ванилью JS:

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

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

Ответ 3

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

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

Ответ 4

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

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

Ответ 5

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

"""

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

"""

Ответ 6

Если вы имеете дело с переменными "scope", это может быть лучшим решением.

Object.keys(filter).reduce(function(accObj, parseObj) {
                accObj[parseObj] = false;
                return accObj;
              }, {});

Ответ 7

С ES6 функции однострочник без мутации:

{
  ...Object.keys(filter).reduce((reduced, key) => ({ ...reduced, [key]: false }), {})
}