簡體   English   中英

通過在其屬性中展平數組來創建對象

[英]Create an object by flattening an array in his properties

我需要創建一個對象數組,其中每個對象只包含屬性數組的一個值。

我會寫一個輸入和預期結果的例子,因為我認為這個問題很令人困惑,但我真的不知道如何解釋它。

數組的第一個元素包含所有屬性和數組的第一個值。 第一個元素之后的每個元素都應該有一個唯一的 id 和一個新的屬性(例如鏈接),指的是第一個元素的 id。

輸入:

const series = [
{
   id: 1,
   name: 'game of thrones',
   ep: ['01-01-2020','04-03-2020'] // This is the array that will split
},
{
   id: 2,
   name: 'stranger things',
   ep: ['03-02-2020']
}
]

預期產出:

const newSeries = [
{
   id: 1, // same id as before
   name: 'game of thrones', // same name as before
   ep: ['01-01-2020'] // first element of the previous array
},
{
   id: 2, // untouched
   name: 'stranger things',
   ep: ['03-02-2020']
},
{
   id: 35, // Any id
   ep: ['04-03-2020'] // second element
   link: 1 // This is the id of the original element
   // name is not necessary
}
// If ep had 3 dates, it would make a new element 
]

我不介意對象的順序。 如果數組中有更多元素,它將繼續直到只有一個。

編輯:忘記提交我的嘗試:

series.forEach(x => x.ep.map(epdate=> 
         newarray = [...newarray, {id:'some id', ep: epdate, link: x.id}]
    ))

我設法拆分了數組,但我錯過了識別項目是第一個並且需要保留名稱還是在第一個之后並且需要鏈接的邏輯。 另外,我需要創建一個必須是唯一的隨機 ID。

設法讓它與此代碼一起使用:

serie.forEach(x => {
    x.ep.length > 1 ? 
    x.ep.map(y => 
        y === x.ep[0] ? 
         newarray = [...newarray, {id: x.id, name: x.name, ep: y}] :
        newarray = [...newarray, {id: 'id', ep: y, link: x.id}])
     : 
    newarray = [...newarray, {...x, ep: x.ep[0]}]
})

唯一的問題是 id 不是唯一的。 我還建議查看 Calvin 的答案,因為它在代碼方面非常清晰和干凈。

方法不止一種,但我總是喜歡使用老式的for循環而不是 ES6 語法(在我看來,為了更好的可讀性),但讓我們看看:

使用for循環您的series數組,檢查其ep以查看長度是否大於 1。
如果是,那么您可以執行以下步驟:

  1. ep數組放入一個新變量中
  2. serie對象推送到結果數組 ( newSeries )
  3. 使用另一個for循環ep數組(從索引 1 開始,因為索引 0 將保留在原始序列中)
  4. 在這個循環中,創建一個新對象並設置你想要的屬性
  5. 將這個新對象推入newSeries

如果沒有,那么只需將該serie對象推送到newSeries

 const series = [ { id: 1, name: 'game of thrones', ep: ['01-01-2020', '04-03-2020', '01-05-2020']}, { id: 2, name: 'stranger things', ep: ['03-02-2020']} ] let newSeries = []; let idCounter = series.length + 1; for (let i = 0; i < series.length; i++) { let serie = series[i] if (serie.ep.length > 1) { let allEps = serie.ep; serie.ep = [serie.ep[0]] newSeries.push(serie); for (let j = 1; j < allEps.length; j++) { let newSerieObj = {}; newSerieObj.id = idCounter; newSerieObj.ep = [allEps[j]] newSerieObj.link = serie.id; newSeries.push(newSerieObj); idCounter++; } } else { newSeries.push(serie) } } console.log(newSeries)
 .as-console-wrapper { min-height: 100% }

注意:我使用變量idCounter只是為了舉例,您可以使用自己的邏輯來設置新的 Id。

如果您希望創建的對象(具有新 id 的對象)始終排在數組的最后,您有兩個選擇: .sort by id; 或者不要推送到newSeries而是推送到另一個數組,並且在所有循環結束后只.concat這個另一個數組。

暫無
暫無

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

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