为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

UYOU 2023-06-15 17:38:08
好吧,我真的不知道这里发生了什么。我假设它是某种参考问题?但我不知道如何解决它或导致它的原因。总而言之,我有一个对象列表,以及一个预先填充的对象,以确保我拥有该对象中所有键的数据。我需要遍历这个对象列表,并通过使用元数据对象中的 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,这是一个参考,并且在每次调用时都会更新?但我在这里完全不知所措。
查看完整描述

1 回答

?
素胚勾勒不出你

TA贡献1827条经验 获得超9个赞

问题是您指的是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;

  }, {});


查看完整回答
反对 回复 2023-06-15
  • 1 回答
  • 0 关注
  • 94 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信