【问题标题】:How to assign an object property value as another object property?如何将对象属性值分配为另一个对象属性?
【发布时间】:2022-11-10 22:04:02
【问题描述】:

我有以下 JavaScript 代码:

const data = {
  columnFields: {
    columnField1: 'FieldValue1',
    columnField2: 'FieldValue2',
    columnField3: 'FieldValue3',
  },

  dataSets: [
    {
      columnProp1: 'value1',
      columnProp2: 'value2',
      columnProp3: 'value3',
    },
    {
      columnProp1: 'value11',
      columnProp2: 'value22',
      columnProp3: 'value33',
    },
  ],
};

我想从这些数据中看到以下输出:

const expectedOutput = [
  {
    FieldValue1: 'value1',
    FieldValue2: 'value2',
    FieldValue3: 'value3',
  },
  {
    FieldValue1: 'value11',
    FieldValue2: 'value22',
    FieldValue3: 'value33',
  },
];

我尝试了以下解决方案

function processData() {
  const processDataSet = [];
  const obj = {};
  data.dataSets.forEach((item) => {
    for (const key in item) {
      const element = item[key];
      for (const prop in data.columnFields) {
        obj[data.columnFields[props]] = element;
      }
    }
    processDataSet.push(obj);
  });

  return processDataSet;
}

这给了我以下输出,这不是我想要的:

const output = [
  {
    FieldValue1: 'value33',
    FieldValue2: 'value33',
    FieldValue3: 'value33',
  },
  {
    FieldValue1: 'value33',
    FieldValue2: 'value33',
    FieldValue3: 'value33',
  },
];

这是预期的,因为每次它都覆盖该值并以最后一个值结束。请帮助我了解代码的方向,通过它我可以同时在循环中分配单个值。

【问题讨论】:

    标签: javascript arrays object for-in-loop


    【解决方案1】:
    • columnFields 上使用Object#values,您可以获得要在结果对象数组中使用的键列表
    • 使用Array#map,遍历dataSets
    • 在每次迭代中,使用Object#values 获取当前对象的值列表。使用Array#reduce,迭代后者以创建一个对象,其中包含最初计算的键和当前值

    const data = {
      columnFields: { columnField1: 'FieldValue1', columnField2: 'FieldValue2', columnField3: 'FieldValue3' },
      dataSets: [
        { columnProp1: 'value1', columnProp2: 'value2', columnProp3: 'value3' },
        { columnProp1: 'value11', columnProp2: 'value22', columnProp3: 'value33' }
      ]
    };
    
    const { columnFields, dataSets } = data;
    const keys = Object.values(columnFields);
    const res = dataSets.map(e => 
      Object.values(e).reduce((acc, value, index) => ({
        ...acc,
        [keys[index]]: value
      }), {})
    );
    
    console.log(res);

    【讨论】:

      猜你喜欢
      • 2011-02-17
      • 1970-01-01
      • 2015-10-22
      • 1970-01-01
      • 2020-06-22
      • 2013-05-23
      • 1970-01-01
      • 2019-07-16
      • 1970-01-01
      相关资源
      最近更新 更多