【问题标题】:Merge array into object properties in JavaScript将数组合并到 JavaScript 中的对象属性中
【发布时间】:2019-11-14 02:04:07
【问题描述】:

我有一个小问题,我有两个像这样的简单对象

var state = {
    Value1: "Something",
    Value2: "Else"
};


var claims = [
    "Viewing",
    "Editing",
    "Delete"
];

我想创建一个看起来像这样的对象。

var newState = {
    Value1: "Something",
    Value2: "Else",

    /* Array merged into properties with defaults. */
    Viewing: true,
    Editing: true,
    Delete: true
};

我考虑过使用 jQuery $.map() 或者 Object.assign()(这似乎更接近我想要的),但我似乎无法确切地知道如何实现我需要的结果。

如标题所述,如何将数组作为属性合并到现有对象中,同时设置默认值?

【问题讨论】:

  • @CarstenLøvboAndersen 我已经明确描述了我考虑过的两种方法,但它们都没有达到我想要的效果。此外,从下面的响应中可以清楚地看出,在没有经过混淆的代码的情况下实现上述目标并不是那么简单的问题。

标签: javascript jquery arrays ecmascript-6 ecmascript-5


【解决方案1】:

对于给定的简单示例,请尝试以下操作:

var state  = {Value1:"Something",Value2:"Else"}; 
    claims = ["Viewing","Editing","Delete"];

let res = Object.assign(state, claims.reduce((a,c) => {a[c] = true; return a},{}))
console.log(res)

【讨论】:

    【解决方案2】:

    你可以使用解构和一个简单的Array#forEach

    const state = {
        Value1: "Something",
        Value2: "Else"
    };
    
    
    const claims = [
        "Viewing",
        "Editing",
        "Delete"
    ];
    
    const newState = {
      ...state
    }
    
    claims.forEach(prop => newState[prop] = true);
    
    console.log(newState)

    【讨论】:

      【解决方案3】:

      我使用reduce 将数组转换为对象并合并两个对象

      var state = {
          Value1: "Something",
          Value2: "Else"
      };
      
      
      var claims = [
          "Viewing",
          "Editing",
          "Delete"
      ];
      var obj = claims.reduce(function(acc, cur) {
                  acc[cur] = true;
                  return acc;
                }, {});
      
      var returnedData = Object.assign(state, obj);
      
      console.log(returnedData)

      【讨论】:

        【解决方案4】:

        您可以使用带有 obj[myStringAsName] = value 的变量名添加属性

        var state = {
            Value1: "Something",
            Value2: "Else"
        };
        
        
        var claims = [
            "Viewing",
            "Editing",
            "Delete"
        ];
        
        var newState = state;
        claims.forEach(function(item){
        	newState[item] = true;
        })
        
        console.log(newState)

        【讨论】:

          猜你喜欢
          • 2015-12-05
          • 1970-01-01
          • 2016-04-20
          • 2019-03-31
          • 1970-01-01
          • 1970-01-01
          • 2021-03-29
          • 1970-01-01
          • 2018-02-08
          相关资源
          最近更新 更多