0

我有一个反应组件,我试图将对象传播到构造函数中的状态中。

constructor() {
    super()

    const shapesArray = [1, 2, 3]

    let renderStates = shapesArray.map((el, i) => {
        return {['shape'+i]: 'black'}
    })

    this.state = { ...renderStates }
    console.log(this.state)
}

我想通过做来访问颜色this.state.shape0,但是当我控制台日志时this.state,我得到了这个:

在此处输入图像描述

而不是Object {shape0: "black", shape1: "black", shape2: "black"}.

我在这里做错了什么?

4

4 回答 4

3

那是因为您将数组传播到对象中。数组实际上是具有(通常)顺序整数字符串作为键的对象。这些键是数组的索引。

如下图,map取一个数组,产生另一个数组

const shapesArray = [1, 2, 3];

const renderStates = shapesArray.map((el, i) => {
  return {
    ['shape' + i]: 'black'
  }
});

console.log(renderStates);

当传播到一个对象中时,源对象中每个自己的可枚举属性的值被添加到其各自键下的目标中。由于数组的键是它的索引,因此您最终会得到一个对象,该对象具有数组的每个元素的属性。每个属性的名称是它在数组中的索引。

为了实现您想要的,您可以使用Array.prototype.reduce在映射过程中创建的名称从数组中构建一个对象。

const shapesArray = [1, 2, 3];

const renderStates = shapesArray
  .map((el, i) => {
    return {
      ['shape' + i]: 'black'
    }
  })
  .reduce((o, element) => {
    Object.keys(element).forEach(key => o[key] = element[key]);
    return o;
  }, {});

console.log(renderStates);

当然,这本身可以通过在 reduce 中传播对象来更优雅地编写。

const shapesArray = [1, 2, 3];

const renderStates = shapesArray
  .map((el, i) => {
    return {
      ['shape' + i]: 'black'
    }
  })
  .reduce((o, element) => ({...o, ...element}), {});

console.log(renderStates);

于 2017-05-13T20:10:44.800 回答
1

作为对aluan-haddad 答案的优化,reduce 可以处理 map 中的逻辑

const shapesArray = [1, 2, 3];

const renderStates = shapesArray
  .reduce((acc, _, i) => ({
    ...acc,
    ['shape' + i]: 'black',
  }), {});

console.log(renderStates);

于 2017-05-17T00:58:53.667 回答
0

无需在数组上迭代两次。使用减少:

const shapesArray = [1, 2, 3];

const renderStates = shapesArray.reduce((accumulator, i) => {
  accumulator['shape' + i] = 'black';
  return accumulator;
}, {});

console.log(renderStates);
于 2017-07-18T15:16:24.303 回答
0

renderStates是一个数组,它具有从 0 开始的整数属性或数组索引,如果您想具体说明,那么{...renderStates}将获取每个索引,并创建从该索引到与该索引对应的值的映射,以实现您要查找的内容,您需要将renderStates数组减少为像这样的对象

let renderStates = shapesArray.map((el, i) => {
        return {['shape'+i]: 'black'}
    }).reduce((resultObj, currentShape,index) => resultObj['shape'+index] = currentShape['shape'+index]), { });

renderStates现在是一个对象,你可以传播它,它会产生你想要的结果

于 2017-05-13T20:10:51.883 回答