Объединить массив в свойства объекта в JavaScript - PullRequest
0 голосов
/ 03 июля 2019

У меня есть тривиальная проблема, когда у меня есть два простых объекта, подобных этому

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() (что, кажется, ближе к тому, что я хочу), но я не могу понять, как именно добиться нужного мне результата.

Итак, как гласит заголовок, как я могу объединить массив с существующим объектом в качестве свойств, а также установить значения по умолчанию?

Ответы [ 4 ]

2 голосов
/ 03 июля 2019

Для простого приведенного примера попробуйте следующее:

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)
0 голосов
/ 03 июля 2019

Вы можете использовать деструктуризацию и простой 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)
0 голосов
/ 03 июля 2019

Я преобразовал массив в объект, используя 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)
0 голосов
/ 03 июля 2019

Вы можете добавить свойство, используя имя переменной с 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)
...