我将某个对象的某个属性的值从列表转换为键/值列表。Javascript将值转换为密钥
我正在寻找不同的语法或更短的语法。
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}
我将某个对象的某个属性的值从列表转换为键/值列表。Javascript将值转换为密钥
我正在寻找不同的语法或更短的语法。
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}
您可以使用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)
这与SED unix语法一样丑陋。我很伤心。我爱1995年以来的JS,这不再是JS :( – mplungjan
@mplungjan但不过,但它“更先进”!这显然使它成为600%。 –
哈哈:)是的。简洁是伟大的。 Hello world:'++++++++++ [> +++++++> ++++++++++> +++ <<<-]> ++。> +。+++++ ++ .. +++。> ++。<< +++++++++++++++。>。+++。------ .------ - 。> +。'in [BrainFuck](https://en.wikipedia.org/wiki/Esoteric_programming_language#brainfuck) – mplungjan
你可能寻找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);
}, {});
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;
@Downvoter why? –
这是“更先进”的方式? –
它的功能更强大,因为它在一个表达式中被评估! –
也许你可以在一个函数中使用它。我不是很确定,但它的作品适合我。
//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 }
同值是相同的列表。我希望这个帮助。
heh。 “更先进”。有人应该包含一个使用with和gotos的例子。 –
@KevinB你是什么意思? – mehr
您尚未指定“更高级”的含义。这是一个非常主观的描述,可能对任何人都有意义。更好/更差的表现,更容易/更难以阅读,更好/更差的效率等。 –