使用.map影响整个对象(使其未定义)而不是更新属性

时间:2017-01-05 00:42:48

标签: javascript ecmascript-6

当我这样做时:

csvParse(txtString, {columns: true})

我得到一个对象数组,在其中我想为每个对象更新某个属性。

但所有发生的事情都是对象变得不确定。

这完全符合我的预期:

let x = [{
  y: 123,
  z: 'abc'
}, {
  y: 456,
  z: 'efg'
}, {
  y: 789,
  z: 'hij'
}];

console.log(x);

x.map(x => {
  x.z.toUpperCase();
});
console.log(x); // no changes saved

x.map(x => {
  x.z = x.z.toUpperCase();
});
console.log(x); //now z is uppercase

然而,当我在我的代码中执行相同操作时:

resolve(
  csvParse(txtString, {
    columns: true
  })
  .map(x => {
    x.categories = x.categories
      .replace(regexes.doubleQuotesOrSquareBrackets, '')
      .split(',');
  })
);

结果数组中的每个元素都是未定义的。

1 个答案:

答案 0 :(得分:5)

ES6函数的工作方式是,当存在单个语句时返回计算值,如果有多个语句则需要显式使用return

在您的情况下,您的单个语句是一个赋值操作。

因此技术上返回undefined

.map(x => {
       x.categories = ...
});

只是

.map(x => {
       x.categories = ...
       return undefined;
});

要解决此问题,您可以

.map(x => {
       x.categories = ...;
       return x.categories;
});

.map(x => {
    ...;
    return x;
});