16

我发现自己经常遇到这种模式。我有一组从我的 api 返回的对象,我只需要操作所有对象中的一个属性。

有没有办法使用 ES6/Babel 或 Typescript 让该模式更具声明性?

寻找一些巧妙的解构技巧或类似的东西。

const data = [{ foo: 1, bar: 2}, 
              { foo: 2, bar: 3},
              { foo: 3, bar: 4}];

const increment = a => a + 1;

// Here is my typical pattern
const result = data.map(o => {
    o.foo = increment(o.foo);
    return o;
})

console.log(result);

4

5 回答 5

30

使用Stage 3 预设在 Babel 中可用的Object spread ( ...) 可以解决问题:

const data = [
  { foo: 1, bar: 2 }, 
  { foo: 2, bar: 3 },
  { foo: 3, bar: 4 },
];

const increment = a => a + 1;

const result = data.map(o => ({ ...o, foo: increment(o.foo) }));
console.log(result);

于 2017-02-17T20:10:13.357 回答
6

我认为这更优雅 - Object.assign 是更新对象中项目的好方法

const data = [{
  foo: 1,
  bar: 2
}, {
  foo: 2,
  bar: 3
}, {
  foo: 3,
  bar: 4
}];

const increment = a => a + 1;

// Here is my typical pattern
const result = data.map(o => Object.assign(o, {foo: increment(o.foo)}))

console.log(result);

于 2017-02-17T20:08:58.360 回答
2

对于原位版本,您可以对对象的键使用闭包并将对象作为参数。

const data = [{ foo: 1, bar: 2 }, { foo: 2, bar: 3 }, { foo: 3, bar: 4 }];
const increment = k => o => o[k]++;

data.forEach(increment('foo'));
console.log(data);

于 2017-02-17T20:13:45.703 回答
0

关于什么:

data.map(d => (
  Object.assign({}, d, {foo: d.foo + 1})
));

于 2017-02-17T20:08:59.323 回答
0

这一切不完全等同于:

const data = [{ foo: 1, bar: 2 }, { foo: 2, bar: 3 }, { foo: 3, bar: 4 }];

const result = data.slice();
result.forEach(e => e.foo++);
console.log(result);

于 2017-02-17T20:28:21.050 回答