我将对象的某个属性的值从列表转换为键/值列表。
我正在寻找不同的语法或更短的语法。
const lst = [{ id: 1, name: 'A' }, { id: 2, name: 'B' }];
const obj = {};
lst.forEach((per) => {
obj[per.name] = true;
});
console.log('obj', obj);
结果:
{A: true, B: true}
答案 0 :(得分:0)
您可能正在寻找array.reduce
,对象传播或它的API对应Object.assign
以及计算属性名称。
var obj = lst.reduce((c, v) => ({ ...c, [v.name]: true }), {});
基本上如下:
var obj = lst.reduce(function(carry, value){
var obj = {};
obj[value.name] = true;
return Object.assign(carry, obj);
}, {});
答案 1 :(得分:0)
您可以使用Object.assign()
和扩展语法添加到对象,在数组中,您可以map()
将每个对象转换为{[e.name]: true}
。
const lst = [{ id: 1, name: 'A' }, { id: 2, name: 'B' }];
const obj = Object.assign({}, ...lst.map(e => ({[e.name]: true})))
console.log(obj)
答案 2 :(得分:0)
const lst = [{ id: 1, name: 'A' }, { id: 2, name: 'B' }];
const obj = lst.reduce((a, o) => (a[o.name] = true, a), {});
console.log(obj);
以上是不言自明的简称:
const obj = lst.reduce(function(accumulator, current) {
return accumulator[current.name] = true, accumulator; // read about comma operator evaluation on MDN
}, {});
和
return accumulator[current.name] = true, accumulator;
与:
相同accumulator[current.name] = true;
return accumulator;
答案 3 :(得分:0)
也许你可以在一个函数中使用它。我不太确定,但它对我有用。
//In a fucntion
function asingListinObject(list, obj){
//if obj comes undefined or null create one
if(obj == undefined || obj == null){
obj = {};
}
//do the asignment by the list
list.forEach((i_lts) => {
//validate if the 'name' exist
if(i_lts.name != undefined || i_lts.name != null){
//New: set a diferent value
if(i_lts.value != undefined || i_lts.value != null){
obj[i_lts.name] = i_lts.value;
}else{
//Set a default value
obj[i_lts.name] = true;
}
}
});
return obj;
}
const lst = [{ id: 1, name: 'A' }, { id: 2, name: 'B' },
{ id: 3, name: 'C', value: false }, { id: 4}];
const obj_ref = {};
const obj = asingListinObject(lst);
//works as references
asingListinObject(lst,obj_ref);
console.log('Obj_Ref', obj);
console.log('Obj', obj);
因此,您将拥有:
Obj_Ref {A: true, B: true, C: false }
Obj {A: true, B: true, C: false }
相同的值因为是相同的列表。我希望这有帮助。