簡體   English   中英

JavaScript-扁平化嵌套對象數組

[英]JavaScript - Flatten Array of Nested Objects

我正在處理對象數組,需要使用對象值作為新的對象鍵來展平並將數據集重新分配為單個對象的數組。

傳入數據:

results = [
  {
    surveyValues: [
      { id: 135, name: 'First Name', value: 'Jim' },
      { id: 136, name: 'Last Name', value: 'Jones' },
      { id: 137, name: 'City', value: 'Fredsburg' },
    ],
  },
  {
    surveyValues: [
      { id: 135, name: 'First Name', value: 'Greg' },
      { id: 136, name: 'Last Name', value: 'Jones' },
      { id: 137, name: 'City', value: 'Waverly' },
    ],
  },
];

所需結果:

output = [
  {
    id: 1, FirstName: 'Jim', LastName: 'Jones', City: 'Fredsburg',
  },
  {
    id: 2, FirstName: 'Greg', LastName: 'Jones', City: 'Waverly',
  },
];

我目前的嘗試是讓我以正確的順序放置更新的鍵/值對,但是創建了大量的單個對象。

當前代碼:

const results = [];

surveyResults.map(s => s.surveyValues)
  .forEach(s => Object.entries(s)
  .forEach(([key, value]) => {
    Object.entries(value)
      .forEach(([k, v]) => {
        if (k === 'name') {
          results.push({
            id: value.id,
            [v]: value.value.toString(),
          });
        }
    });
}));

當前代碼輸出:

[
  {
    id: 135, FirstName: 'Jim',
  },
  {
    id: 136, LastName: 'Jones',
  },
  {
    id: 137, City: 'Fredsburg',
  },
  {
    id: 135, FirstName: 'Greg',
  },
  {
    id: 136, LastName: 'Jones',
  },
  {
    id: 137, City: 'Waverly',
  },
]

我缺少什么,為什么我的代碼未按需要創建新的對象數組?

您可以使用mapreduce來實現。 我還在地圖函數的回調中訪問索引i ,以設置id屬性和string.replace()來從FirstNameLastName鍵中刪除空格。

 const results = [ { surveyValues: [ { id: 135, name: 'First Name', value: 'Jim' }, { id: 136, name: 'Last Name', value: 'Jones' }, { id: 137, name: 'City', value: 'Fredsburg' }, ], }, { surveyValues: [ { id: 135, name: 'First Name', value: 'Greg' }, { id: 136, name: 'Last Name', value: 'Jones' }, { id: 137, name: 'City', value: 'Waverly' }, ], }, ]; const result = results.map((e, i) => e.surveyValues.reduce((a, e) => { a[e.name.replace(" ", "")] = e.value; return a; }, {id: i + 1}) ); console.log(result); 

在外部map()循環中創建每個對象,並在內部的forEach()向其添加屬性。

 surveyResults = [ { surveyValues: [ { id: 135, name: 'First Name', value: 'Jim' }, { id: 136, name: 'Last Name', value: 'Jones' }, { id: 137, name: 'City', value: 'Fredsburg' }, ], }, { surveyValues: [ { id: 135, name: 'First Name', value: 'Greg' }, { id: 136, name: 'Last Name', value: 'Jones' }, { id: 137, name: 'City', value: 'Waverly' }, ], }, ]; const results = surveyResults.map((s, i) => { let v = s.surveyValues; let obj = {id: i}; v.forEach(item => obj[item.name.replace(/\\s+/g, "")] = item.value.toString()); return obj; }); console.log(results); 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM