【问题标题】:How can I set all the properties of an array of objects to true?如何将对象数组的所有属性设置为 true?
【发布时间】:2019-09-24 18:04:40
【问题描述】:

我尝试映射一些 JSON 数据并将所有属性设置为 true。

我知道您可以为此使用 map 函数,但是 JSON 的设置方式,数组中的每个对象都有一个键名。

所以当我运行 map 函数时,它会将所有键名设置为 false,而不是对象本身内部的属性。

这是 JSON 数据:

{
    "Presentations": {
        "Instant": false,
        "Daily": false,
        "WeeklySummary": false,
        "ContentTypeId": 5
    },
    "Articles": {
        "Instant": true,
        "Daily": false,
        "WeeklySummary": true,
        "ContentTypeId": 1
    },
    "Blogs": {
        "Instant": true,
        "Daily": false,
        "WeeklySummary": true,
        "ContentTypeId": 61
    },
    "NewsBriefs": {
        "Instant": false,
        "Daily": false,
        "WeeklySummary": false,
        "ContentTypeId": 2
    },
    "SpecialInsights": {
        "Instant": false,
        "Daily": false,
        "WeeklySummary": false,
        "ContentTypeId": 50
    }
}

这是我尝试的map函数,其中data指的是上面的JSON:

Object.entries(data).map(([key, value]) => {
     return value === true;
});

这又会返回一个包含五个项目的数组,其值为false

[false,false,false,false,false]

我正在尝试做的是将任何项目的值翻转为真。

【问题讨论】:

  • @silencedogood 我不这么认为,在那种情况下结果也会一样
  • 我真的不明白你想达到什么目的?你能解释一下以获得答案吗?
  • const truthify = o => Object.keys(o).forEach(k => { if (o[k] === false) o[k] = true; if (typeof o[k] === "object") truthify(o[k]); }); 虽然请注意,如果没有进一步检查,这将是例如还会影响保存数组的属性,数组保存真/假值。这几乎是搜索和 d̵e̵s̵t̵r̵o̵y̵ 设置为真
  • @silencedogood 嗨,如果没有解释清楚,对不起。我想要做的是将数组中每个对象内的所有值更改为 false 值。因此,例如,“Presentations”对象下当前为假的所有属性都将更改为真值。其他对象也是如此。我遇到的问题是我不知道如何达到“第二”级别,可以这么说,目前我的代码只是将键名更改为 false 而不是每个对象本身的属性。跨度>
  • 这里没有数组。你有一个对象,里面有对象。这是一个非常重要的区别,因为数组具有与对象不同的属性和方法。

标签: javascript arrays json underscore.js javascript-objects


【解决方案1】:

你也可以简单地使用嵌套的 forEach 来做到这一点,就像这样 -

    const a = {
      "Presentations": {
        "Instant": false,
        "Daily": false,
        "WeeklySummary": false,
        "ContentTypeId": 5
    },
    "Articles": {
        "Instant": true,
        "Daily": false,
        "WeeklySummary": true,
        "ContentTypeId": 1
    },
    "Blogs": {
        "Instant": true,
        "Daily": false,
        "WeeklySummary": true,
        "ContentTypeId": 61
    },
    "NewsBriefs": {
        "Instant": false,
        "Daily": false,
        "WeeklySummary": false,
        "ContentTypeId": 2
    },
    "SpecialInsights": {
        "Instant": false,
        "Daily": false,
        "WeeklySummary": false,
        "ContentTypeId": 50
    }
}
    
    Object.keys(a).forEach(ele => {
    	Object.keys(a[ele]).forEach(childEle => {a[ele][childEle] = true});
    })
    
    console.log(a);

【讨论】:

    【解决方案2】:

    你不需要映射任何东西

    var arr = your_json;
    for(a in arr){
        arr[a]['Instant'] = true;
        arr[a]['Daily'] = true;
        arr[a]['WeeklySummary'] = true;
    }
    

    如果你不知道属性

    for(a in arr){
        for(e in arr[a]){
            !arr[a][e] ? arr[a][e] = true : null
        }
    }
    

    【讨论】:

      【解决方案3】:

      使用递归:

      function flip(o) {
        for (k of Object.keys(o)) {
          if (typeof o[k] === "object") {
            flip(o[k])
          }
          if (o[k] === false) {
            o[k] = true;
          }
        }
      }
      
      
      
      const o = {
          "Presentations": {
              "Instant": false,
              "Daily": false,
              "WeeklySummary": false,
              "ContentTypeId": 5
          },
          "Articles": {
              "Instant": true,
              "Daily": false,
              "WeeklySummary": true,
              "ContentTypeId": 1
          },
          "Blogs": {
              "Instant": true,
              "Daily": false,
              "WeeklySummary": true,
              "ContentTypeId": 61
          },
          "NewsBriefs": {
              "Instant": false,
              "Daily": false,
              "WeeklySummary": false,
              "ContentTypeId": 2
          },
          "SpecialInsights": {
              "Instant": false,
              "Daily": false,
              "WeeklySummary": false,
              "ContentTypeId": 50
          }
      }
      
      flip(o);
      console.log(o);

      【讨论】:

        【解决方案4】:

        根据您的 ES 版本和所需的浏览器支持,这里有几种不同的方法。

        var data = {
            "Presentations": {
                "Instant": false,
                "Daily": false,
                "WeeklySummary": false,
                "ContentTypeId": 5
            },
            "Articles": {
                "Instant": true,
                "Daily": false,
                "WeeklySummary": true,
                "ContentTypeId": 1
            },
            "Blogs": {
                "Instant": true,
                "Daily": false,
                "WeeklySummary": true,
                "ContentTypeId": 61
            },
            "NewsBriefs": {
                "Instant": false,
                "Daily": false,
                "WeeklySummary": false,
                "ContentTypeId": 2
            },
            "SpecialInsights": {
                "Instant": false,
                "Daily": false,
                "WeeklySummary": false,
                "ContentTypeId": 50
            }
        };
        
        /* ES5 */
        var outterKeys = Object.keys(data);
        for(var o = 0; o < outterKeys.length; o++){
          var outterObject = data[outterKeys[o]];
          var innerKeys = Object.keys(outterObject);
          for(var i = 0; i < innerKeys.length; i++){
            var innerObject = outterObject[innerKeys[i]];
            if (!innerObject){
              data[outterKeys[o]][innerKeys[i]] = true;
            }
          }
        }
        
        console.log('es5', data);
        
        /* ES6 */
        data = {
            "Presentations": {
                "Instant": false,
                "Daily": false,
                "WeeklySummary": false,
                "ContentTypeId": 5
            },
            "Articles": {
                "Instant": true,
                "Daily": false,
                "WeeklySummary": true,
                "ContentTypeId": 1
            },
            "Blogs": {
                "Instant": true,
                "Daily": false,
                "WeeklySummary": true,
                "ContentTypeId": 61
            },
            "NewsBriefs": {
                "Instant": false,
                "Daily": false,
                "WeeklySummary": false,
                "ContentTypeId": 2
            },
            "SpecialInsights": {
                "Instant": false,
                "Daily": false,
                "WeeklySummary": false,
                "ContentTypeId": 50
            }
        };
        
        Object.keys(data).forEach((o) => {
          Object.keys(data[o]).forEach((i) => {
            if (!data[o][i]){
              data[o][i] = true
            }
          })
        });
        console.log('es6', data);

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-07-12
          • 1970-01-01
          • 2016-01-05
          • 1970-01-01
          • 2018-10-19
          • 2021-07-19
          • 2019-04-23
          相关资源
          最近更新 更多