【问题标题】:Set all Object keys to false将所有对象键设置为 false
【发布时间】:2016-11-28 02:15:56
【问题描述】:

假设我有一个对象

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

我想将所有键设置为 false(以重置它们)。最好的方法是什么,我想避免循环使用foreach 和其他东西。有整齐的单衬吗?

【问题讨论】:

  • 谢谢,请写答案!
  • 这个怎么样,filter: {},如果你也处理了filter?

标签: javascript lodash


【解决方案1】:

这是一个带有香草 JS 的单线:

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

它确实使用带有 .forEach() 方法的隐式循环,但您必须以一种或另一种方式循环(除非您通过用硬编码的默认对象字面量替换整个对象来重置)。

【讨论】:

  • 如果我错了,请纠正我,但这不能在没有循环的情况下完成。不确定 OP 是否理解这一点。
  • @CarlEdwards 很好,卡尔。没想到箭头函数这么有用。
  • 即使没有箭头功能,它仍然很短,就像其他答案一样。
  • 是的,在这种情况下,箭头语法几乎与传统的function() {} 相同。只是少了一点打字。
【解决方案2】:

使用 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 }

【讨论】:

  • 谢谢。一个问题,如果我想获得具有“真”值的属性(任何时候只有一个),如何最好地做到这一点?
  • 示例数据掩盖了一次只有一个属性是true 的断言。但不管有多少,_.keys(filter).filter(k => filter[k]) 都会为您提供一个快速数组,其中包含所有真实值的键。如果您想要严格的布尔值,您可以使用与 true 的精确等价。您始终可以索引结果数组以获取第一个数组:_.keys(filter).filter(k => filter[k])[0]。如果没有,则返回 undefined。抱歉,该表达式中出现了三个“过滤器”实例,但您的变量名称重载了函数名称。
  • @chefcurry7 你可能还喜欢_.find(_.keys(filter), k => filter[k])。它的工作原理类似,但略短。
  • 如果你使用 lodash,这是最好的解决方案!
【解决方案3】:

如果你不使用 ES6,这里是它的 ES5 对应物。

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

【讨论】:

    【解决方案4】:

    如果您不想修改数组,这里有一个 ES6 替代方案,它返回一个新数组:

    Object.fromEntries(Object.keys(filter).map((key) => [key, false]))
    

    解释:

    Object.keys 返回对象的键:

    Object.keys({ a: 1, b: 2 }) // returns ["a", "b"]
    

    然后我们将结果["a", "b"]映射到[key, false]:

    ["a", "b"].map((key) => [key, false]) // returns [['a', false], ['b', false]]
    

    最后我们调用Object.fromEntries,将[key, value]形式的数组映射到一个对象:

    Object.fromEntries([['a', false], ['b', false]]) // returns { a: false, b: false }
    

    【讨论】:

      【解决方案5】:

      一小行代码兼容所有浏览器:

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

      【讨论】:

        【解决方案6】:

        使用 ES6 功能,单行无变异:

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

        【讨论】:

        • ` ...Object.keys(filter).reduce((reduced, key) => ({ ...reduced, [key]: false }), {})` 就足够了。无需将其包装在对象中
        • 这适用于我的用例,需要不变性,尽管 OP 没有将其作为要求。
        【解决方案7】:

        必须使用hasOwnProperty

        ```

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

        ```

        【讨论】:

          【解决方案8】:

          如果您正在处理“范围”变量,这可能是一个更好的解决方案。

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

          【讨论】:

            【解决方案9】:

            这就是我所说的简洁的单线解决方案:

            const filtered = Object.assign(...Object.keys(filter).map(k => ({ [k]: false })));
            

            演示:

            const filter = {
              'ID': false,
              'Name': true,
              'Role': false,
              'Sector': true,
              'Code': false
            };
            
            const filtered = Object.assign(...Object.keys(filter).map(k => ({ [k]: false })));
            
            console.log(filtered);

            我们基本上是使用Object.assign() 将对象转换为数组,因此我们可以使用map() 函数将每个属性值设置为false,然后使用Object.assign() 将数组转换回对象扩展运算符:)

            【讨论】:

              猜你喜欢
              • 2017-01-18
              • 1970-01-01
              • 2019-05-29
              • 2019-06-11
              • 2012-08-22
              • 2016-06-24
              • 2021-07-31
              • 2021-06-04
              • 1970-01-01
              相关资源
              最近更新 更多