使用map从数组中解构对象?

8

我编写了这个简单的代码,从一个对象数组中解构出每个键并构建新的数组。我正在学习ES6,并希望使用解构将其重构为一行代码,但我不完全明白如何做到。

let candles = [{
  open: 1,
  high: 2,
  low: 0.5,
  close: 1.5,
  volume: 200
}];
let open = candles.map(x => x.open);
let high = candles.map(x => x.high);
let low = candles.map(x => x.low);
let close = candles.map(x => x.close);
let volume = candles.map(x => x.volume);

console.log(open, high, low, close, volume);

我认为它的外观应该类似于这个样子吗?
let [open, high, low, close, volume] = candles.map(key => key.value); 

但这显然是错误的!如果有人能指导我正确地完成这个任务,谢谢你的帮助!

1
在第一个片段中,您正在将数组映射到数组的数组。 - Andrew Li
1
一些示例数据的前后对比会非常有助于解释您试图做什么,但就我所知,您无法使用一行代码完成此操作。 - Phil
正如li357所述,运行代码片段后,您可以看到如何创建数组等。 - Randy Casburn
1
一些 之前和之后 的例子... - Phil
1
完整的输入和完整的预期结果是什么? - guest271314
显示剩余4条评论
5个回答

3
尽管 `map` 强大且有用,但它并不是您示例情况下最有效的策略。
最简单的方法是根本不使用 `map`。如果您真的想要一个一行解决方案,尝试使用解构:
let candles = [{
  open: 1,
  high: 2,
  low: 0.5,
  close: 1.5,
  volume: 200
}];

[{open, high, low, close, volume}] = candles

你只需要那个简单的一行代码:

console.log(open, high, low, close, volume)  // 1 2 0.5 1.5 200

2

Here's a solution using Array.prototype.reduce():

const candles = [{open: 1, close: 2, low: 3, high: 4, volume: 5}, {open: 6, close: 7, low: 8, high: 9, volume: 10}];

const result = candles.reduce((a, v) => {
  Object.keys(v).forEach(k => (a[k] = a[k] || []).push(v[k]));
  return a;
}, {});

console.log(result);


0
let candles = [ {
  open: 1,
  high: 2,
  low: 0.5,
  close: 1.5,
  volume: 200
} ]

const { open, high, low, close, volume } = candles.reduce( ( accumulator, item ) => {
    Object.keys( item ).forEach( key => {
        accumulator[ key ] = ( accumulator[ key ] || [] ).concat( item[ key ] ) 
    } )
    return accumulator
}, {} )

0

所以你应该先使用reduce并返回一个对象。然后你可以对其使用解构。这里是一个例子:

const candles = [{
  open: 1,
  high: 2,
  low: 0.5,
  close: 1.5,
  volume: 200
}, {
  open: 2,
  high: 3,
  low: 0.6,
  close: 1.4,
  volume: 300
}];

const reduction = candles.reduce((acc, candle) => {
  for (let key in candle) {
    if (!(key in acc)) {
      acc[key] = [];
    }

    acc[key].push(candle[key]);
  }

  return acc;
}, {});

console.log(reduction);
// { open: [ 1, 2 ],
//   high: [ 2, 3 ],
//   low: [ 0.5, 0.6 ],
//   close: [ 1.5, 1.4 ],
//   volume: [ 200, 300 ] }

const {open, high, low, close, volume} = reduction;

console.log(open, high, low, close, volume);
// [ 1, 2 ] [ 2, 3 ] [ 0.5, 0.6 ] [ 1.5, 1.4 ] [ 200, 300 ]

FYI:Hugo Silva的答案是相同的技术。我将我的分解开来,以便更容易理解正在发生的事情。 - Geuis
谢谢!我发现在es6中使用对象很困难。 - Dan Loze

-1

数组映射解构

简单技巧:[{id:1, name:'awadhesh'}].map(({id, name}) => id + '---' + name);

let candles = [{
 open: 1,
 high: 2,
 low: 0.5,
 close: 1.5,
 volume: 200
}];
let open = candles.map(({open}) => open);
let high = candles.map(({high}) => high);
let low = candles.map(({low}) => low);
let close = candles.map(({close}) => close);
let volume = candles.map(({volume}) => volume);

console.log(open, high, low, close, volume);

日志打印 = [1] [2] [0.5] [1.5] [200]


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接