2017-03-16 45 views
-1

我将某个对象的某个属性的值从列表转换为键/值列表。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} 
+0

heh。 “更先进”。有人应该包含一个使用with和gotos的例子。 –

+0

@KevinB你是什么意思? – mehr

+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

这与SED unix语法一样丑陋。我很伤心。我爱1995年以来的JS,这不再是JS :( – mplungjan

+1

@mplungjan但不过,但它“更先进”!这显然使它成为600%。 –

+0

哈哈:)是的。简洁是伟大的。 Hello world:'++++++++++ [> +++++++> ++++++++++> +++ <<<-]> ++。> +。+++++ ++ .. +++。> ++。<< +++++++++++++++。>。+++。------ .------ - 。> +。'in [BrainFuck](https://en.wikipedia.org/wiki/Esoteric_programming_language#brainfuck) – mplungjan

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

你可能想在'()'中包装'{... c,[v.name]:true}'! –

+0

约瑟夫你的代码返回:未捕获SyntaxError:意外的令牌... – mehr

+0

@mehr这是因为我不指望你复制粘贴答案。对象传播是新的语法,相当于我在回答中提到的Object.assign。 – Joseph

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; 
+1

@Downvoter why? –

+0

这是“更先进”的方式? –

+0

它的功能更强大,因为它在一个表达式中被评估! –

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 } 

同值是相同的列表。我希望这个帮助。

相关问题