从js中另一个对象的值创建新对象

时间:2019-01-26 16:40:03

标签: javascript

我想做的事情非常简单,并且有一个我不理解的语法错误:

我有一个包含一些对象的数组,我想使用这些对象的某些值创建另一个数组:

let fields = [{type:'a',label:'email'},{type:'b',label:'name'},{type:'a',label:'tel'}]
let respone = []

// different implementation
fields.map(item => {
   respone.push({item.label: ''}) } )
`Uncaught SyntaxError: Unexpected token .`


fields.map(item => {
   respone = [...response, {item.label: ''}]  } )
`Uncaught SyntaxError: Unexpected token .`



fields.map(item => {
   respone = [...response, {item['label']: ''}]  } )
`Uncaught SyntaxError: Unexpected token [`

,显然错误是由于创建对象{item['label']: ''}造成的。 这些错误的原因是什么,从现有对象值创建新对象的最佳方法是什么。

3 个答案:

答案 0 :(得分:2)

错误是您试图定义密钥的方式。

item.label需要更改为[item.label],因为您要使用计算键(需要先求值,然后再用作键)

let fields = [{type:'a',label:'email'},{type:'b',label:'name'},{type:'a',label:'tel'}]

let respone = []

fields.forEach(item => {
   respone.push({[item.label]: ''}) } )
   
console.log(respone)

  

item.label[item.label]之间有什么区别?

[item.label]将首先解析item.label,然后用作键,并且不必是有效的标识符

item.label尝试直接将其用作密钥,在这种情况下,该密钥不是正确的JS标识符

以供参考read here

答案 1 :(得分:2)

因此,您有一个由typelabel组成的对象数组。您想使用该数组创建“复合对象”。首先,您不希望respone是一个数组,而希望它成为一个对象。其次,您要将respone上的密钥命名为item.label的值。

尝试以下代码:

let fields = [{type:'a',label:'email'},{type:'b',label:'name'},{type:'a',label:'tel'}]

// Create an empty object
let respone = {}

// Iterate over the fields array, using each one to set the  key and value
//  on our respone object.
fields.forEach(item => { respone[item.label] = item.type} );

// Let's see how it looks!
console.log(respone);

编辑:根据评论,使用.map()并没有任何意义,其目的是返回一个新数组,通常基于转换后的数据在数组值上。在这种情况下,使用Array.forEach(...)更有意义,代码已对此进行了修改。

答案 2 :(得分:0)

这是因为您使用“变量”作为对象键,您需要使用方括号告诉浏览器这是“变量”,否则浏览器会将其视为字符串,但您不能使用“。” ,因此它会引发错误“未捕获的SyntaxError:意外令牌。”:

您应该这样写:

var fields = [{type:'a',label:'email'},{type:'b',label:'name'},{type:'a',label:'tel'}];
var respone = [];

fields.map(item => {
  respone.push({
    [item.label]: ''
  })
});

console.log(respone);

或者,如果您听不懂,这应该可以帮助您了解:

var fields = [{type:'a',label:'email'},{type:'b',label:'name'},{type:'a',label:'tel'}];
var respone = [];

fields.map(item => {
  let obj = {};
  obj[item.label] = '';
  respone.push(obj);
});

console.log(respone);