传播语法与地图不起作用

时间:2017-06-09 07:32:55

标签: javascript ecmascript-6

data.map(obj => 
        {person_name: obj.user.name,
        ...obj})

为什么上面的代码失败了?

我的数据看起来像这样

[{user:{name:'hello'},age:1},{user:{name:'world'},age:1,{user:{name:'another_name'},age:1]

我想从嵌套的obj中“拉出”obj.user.name。

5 个答案:

答案 0 :(得分:2)

试试这个:

data.map(obj => ({person_name: obj.user.name,...obj}))

对象开头的{被解释为块的开头而不是对象。

您可以在MDN

上详细了解相关信息

修改 正如Pawel所提到的,使用包含对象的spread运算符不适用于纯es6,您需要使用此提案中的特定转换:https://github.com/tc39/proposal-object-rest-spread

答案 1 :(得分:1)

你不能传播这样的对象(在Object.assign抛出data.map(obj => Object.assign({person_name: obj.user.name}, obj ));

我会用enum Status: Int { case online = 0 case offline = 1 case na = 2 } 编写它:

// enum as string 
let enumName = "\(Status.online)" // `online`

// enum as int value 
let enumValue = Status.online.rawValue // 0

// enum from int
let enumm = Status.init(rawValue: 1)

答案 2 :(得分:0)

首先,如果要使用箭头函数创建对象,则必须将花括号括在括号中:

data.map(obj => ({ foo: 'bar' }));

否则,JS认为花括号是函数体,并且语法错误。

其次,你不能在对象文字中使用spread运算符。只能在调用函数时使用数组文字或解构时使用它。

答案 3 :(得分:0)

使用babel,您可以使用rest syntax (parameters) ...直接获取对象和商店名称属性的其余部分。



var data = [{ user: { name: 'hello' }, age: 1 }, { user: { name: 'world' }, age: 1 }, { user: { name: 'another_name' }, age: 1 }];

console.log(data.map(({ user, ...obj }) => Object.assign(obj, { person_name: user.name })));

.as-console-wrapper { max-height: 100% !important; top: 0; }




答案 4 :(得分:0)

您可以使用Array.prototype.map()并直接返回所需的对象:



const data = [{user: {name: 'hello'},age: 1}, {user: {name: 'world'},age: 1},{user: {name: 'another_name'},age: 1}];
const result = data.map(obj => {
  return {
    person_name: obj.user.name,
    age: obj.age
  };
});

console.log(result);

.as-console-wrapper { max-height: 100% !important; top: 0; }