亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

有效地將 JavaScript 鍵和值數組轉換為對象

有效地將 JavaScript 鍵和值數組轉換為對象

汪汪一只貓 2023-12-14 17:05:38
我需要將兩個 JavaScript 數組轉換為對象列表。其中一個輸入數組表示輸出對象的鍵,另一個包含其值(以及一些其他信息,與此問題無關)。示例數據:let theKeys = ['firstName', 'lastName', 'city'];let theValues = [{data: [['John', 'Smith', 'New York'],                         ['Mike', 'Doe', 'Chicago'],                         ...                        ],                 otherStuff: ...}                ];上述所需的輸出:output = [{            firstName: 'John',            lastName: 'Smith',            city: 'New York'          },          {            firstName: 'Mike',            lastName: 'Doe',            city: 'Chicago',          },          ...         ](這只是一個示例,我的實際數據來自 REST 響應,內容和長度可能有所不同。我正在使用顯示表格數據的 Vue 應用程序。)下面我現有的代碼適用于少量數據,但在處理大量數據時會使所有瀏覽器崩潰或掛起。return this.theValues.flatMap(results => {  let jsonified = [];  for (let v = 0; v < results.theValues.length; v++) {    let singleJson = {};     for (let k = 0; k < this.theKeys.length; k++) {      let key = this.theKeys[k];      singleJson[key] = results.data[v][k];    }    jsonified.push(singleJson);  }  return jsonified;});對于少至幾千個結果,運行需要幾分鐘。我怎樣才能讓它更快?我是否缺少一些操作可以讓我避免嵌套 for 循環?
查看完整描述

3 回答

?
斯蒂芬大帝

TA貢獻1827條經驗 獲得超8個贊

最簡單的方法可能是將.map值放入鍵值元組并調用Object.fromEntries它:


const theKeys = ['firstName', 'lastName', 'city'];

const theValues = [{

  data: [

    ['John', 'Smith', 'New York'],

    ['Mike', 'Doe', 'Chicago']

  ]

}];


console.log(

  theValues[0].data.map(e =>

    Object.fromEntries(e.map((e,i) => [theKeys[i], e]))

  )

)


查看完整回答
反對 回復 2023-12-14
?
慕雪6442864

TA貢獻1812條經驗 獲得超5個贊

如果您對屬性進行硬編碼而不是查看,您可以擺脫內部循環theKeys,但我懷疑您會想要這樣。您唯一真正不需要的是flatMap. 無論如何,大多數通用數組方法的速度并不為人所知(例如,forEach通常比普通for循環慢)。


FWIW,這似乎表現良好:


let result = [];

for (let i = 0; i < theValues[0].data.length; i++) {

    let resultObj = {};

    for (let j = 0; j < theKeys.length; j++) {

        resultObj[theKeys[j]] = theValues[0].data[i][j];

    }

    result.push(resultObj);

}

我用 11k 個項目對其進行了測試,在 Chrome 中運行時間約為 5 毫秒。對于 90k 項,仍然只需要大約 30 毫秒。


查看完整回答
反對 回復 2023-12-14
?
FFIVE

TA貢獻1797條經驗 獲得超6個贊

您可以放棄這flatMap應該節省一些性能,只需使用普通循環完成所有操作:


const result = []


for (const v of theValues) {

    for (const entry of v.data) {

        const obj = {}

        for (let i = 0; i < entry.length; i++) {

            obj[theKeys[i]] = entry[i]

        }

        result.push(obj)

    }

}

編輯:微觀優化


const result = []

const keysLength = theKeys.length


for (let i = theValues.length - 1; i >= 0; i--) {

    const data = theValues[i].data

    for (let j = data.length - 1; j >= 0; j--) {

        const entry = data[j]

        const obj = {}


        for (let k = keysLength - 1; k >= 0; k--) {

            obj[theKeys[k]] = entry[k]

        }

        result.push(obj)

    }

}


查看完整回答
反對 回復 2023-12-14
  • 3 回答
  • 0 關注
  • 184 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號