我想做的事情非常简单,并且有一个我不理解的语法错误:
我有一个包含一些对象的数组,我想使用这些对象的某些值创建另一个数组:
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']: ''}
造成的。
这些错误的原因是什么,从现有对象值创建新对象的最佳方法是什么。
答案 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)
因此,您有一个由type
和label
组成的对象数组。您想使用该数组创建“复合对象”。首先,您不希望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);