在 reduce 中设置对象中一个特定键的属性是为所有属性设置它

好吧,我真的不知道这里发生了什么。我假设它是某种参考问题?但我不知道如何解决它或导致它的原因。

总而言之,我有一个对象列表,以及一个预先填充的对象,以确保我拥有该对象中所有键的数据。

我需要遍历这个对象列表,并通过使用元数据对象中的 timeframeId 和数据对象中的 id,我想将整个数据对象分配给预填充对象中相应的 timeframeId 和 id 层次结构。

出于某种原因,所有data属性都被覆盖到最后一行data


但是我的代码如下:

const buildSegmentsFromRows = (rows, timeframeMetadata, defaultSegmentData) => {

  // Prepopulate object to make sure every timeframe has a 'hello' key in it with some data

  const emptySegments = timeframeMetadata.reduce((segmentMap, metadata) => {

    segmentMap[metadata.timeframeId] = {

      metadata,

      segments: defaultSegmentData,

    };

    return segmentMap;

  }, {});


  // Now simply just loop over the rows, and set [row.metadata.timeframeId].segments[row.data.id] to row.data

  const segments = rows.reduce((partialSegments, row) => {

    const { timeframeId } = row.metadata;

    const { id } = row.data;


    /**

     * This is the line where everything goes wrong

     */

    partialSegments[timeframeId].segments[id] = row.data;

    return partialSegments;

  }, emptySegments);

  return segments;

};


const rows = [

  {

    metadata: { timeframeId: '20202_01' },

    data: {

      'id': 'hello', 'value': 15

    }

  },

  {

    metadata: { timeframeId: '20202_02' },

    data: {

      'id': 'hello', 'value': 10

    }

  }

]


const timeframemetadata = [

  { timeframeId: '20202_01'},

  { timeframeId: '20202_02'}

]


const defaultSegmentData = {

  'hello': {

    'id': 'hello',

  }

}

console.log(JSON.stringify(buildSegmentsFromRows(rows, timeframemetadata, defaultSegmentData), null, 2))


但是相反,在所有情况下value都设置为。10我在想这是因为我们将属性设置为row.data,这是一个参考,并且在每次调用时都会更新?但我在这里完全不知所措。



UYOU
浏览 99回答 1
1回答

素胚勾勒不出你

问题是您指的是segments列表中的每个对象都是同一个对象。因此,更改 的值segments[id]将更新defaultSegmentData,导致对的每个引用defaultSegmentData也发生变化。  const emptySegments = timeframeMetadata.reduce((segmentMap, metadata) => {    segmentMap[metadata.timeframeId] = {      metadata,      segments: defaultSegmentData, // Everything goes wrong here.    };    return segmentMap;  }, {});此问题的一个简单解决方案是避免在创建时使用对对象的相同引用segmentMap:  const emptySegments = timeframeMetadata.reduce((segmentMap, metadata) => {    segmentMap[metadata.timeframeId] = {      metadata,      /** Or whatever default value you want.       *   Just make sure to create a new instance of it for each call.      */      segments: {},    };    return segmentMap;  }, {});
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript