簡體   English   中英

Javascript一對一對象映射(內置函數?)

[英]Javascript One-To-One Object Mapping (Built-in Function?)

如果我有2個數組( propertiesdata ):

properties = [name, height, weight, zone];

data = [
  ['Luke Skywalker', 123, 112, 'B'],
  ['Jawa', 12, 8, 'B'],
  ['Hutt', 200, 999, 'C']
];

我想創建一個對象數組( statistics ):

statistics = [{
    name: 'Luke Skywalker',
    height: 123,
    weight: 112,
    zone: 'B'
  },
  {
    name: 'Jawa',
    height: 12,
    weight: 8,
    zone: 'B'
  }, {
    name: 'Hutt',
    height: 200,
    weight: 999,
    zone: 'C'
  }
];

通常,我只會在data[]使用map,創建一個temp對象,然后將其推送到statistics[]

但是由於我知道data中的所有其他條目都具有相同的維度和數據類型。 我也知道從propertiesdata一對一的映射。 javascript中是否有內置功能,可以通過一對一映射輸出對象數組? 類似於properties.mapAll(data)類的東西。 我希望不使用庫,因為我正在GAS中的模板.html上執行此操作。

如果屬性始終是nameheightweightzone那么您可以使用Array Destructuring來應用占位符名稱並將其值存儲在map

 const data = [['Luke Skywalker', 123, 112, 'B'], ['Jawa', 12, 8, 'B'], ['Hutt', 200, 999, 'C']]; const stats = data.map(([name, height, weight, zone]) => ({ name, height, weight, zone })) console.log(stats) 

編輯基於GAS上的腳本。 這是相同的方法,但es5。

 var data = [['Luke Skywalker', 123, 112, 'B'], ['Jawa', 12, 8, 'B'], ['Hutt', 200, 999, 'C']]; var stats = data.map(function(dataArray) { return { name: dataArray[0], height: dataArray[1], weight: dataArray[2], zone: dataArray[3] } }) console.log(stats) 

您可以通過采用用於構建命名鍵的屬性數組來映射新對象,並使用Object.assign收集所有對象。

 var properties = ['name', 'height', 'weight', 'zone'], data = [['Luke Skywalker', 123, 112, 'B'], ['Jawa', 12, 8, 'B'], ['Hutt', 200, 999, 'C']], statistics = data.map(a => Object.assign(...properties.map((k, i) => ({ [k]: a[i] })))); console.log(statistics); 
 .as-console-wrapper { max-height: 100% !important; top: 0; } 

您可以使用Array#mapArray#reduce方法。 使用Array#map方法遍歷第二個數組,在其中使用Array#reduce方法生成對象並返回。

let res = data.map(arr => properties.reduce((obj, k, i) => Object.assign(obj, { [k]: arr[i] }), {}));

 let properties = ['name', 'height', 'weight', 'zone'], data = [ ['Luke Skywalker', 123, 112, 'B'], ['Jawa', 12, 8, 'B'], ['Hutt', 200, 999, 'C'] ]; let res = data.map(arr => properties.reduce((obj, k, i) => Object.assign(obj, { [k]: arr[i] }), {})); console.log(res) 

要么

let res = data.map(arr => properties.reduce((obj, k, i) => (obj[k] = arr[i], obj)), {}));

 let properties = ['name', 'height', 'weight', 'zone'], data = [ ['Luke Skywalker', 123, 112, 'B'], ['Jawa', 12, 8, 'B'], ['Hutt', 200, 999, 'C'] ]; let res = data.map(arr => properties.reduce((obj, k, i) => (obj[k] = arr[i], obj), {})); console.log(res) 

您可以使用Array Destructuring提取值並將其替換為返回的Object中的命名屬性。

data.map(([name, height, weight, zone]) => ({name, height, weight, zone}));

 let data = [['Luke Skywalker', 123, 112, 'B'], ['Jawa', 12, 8, 'B'], ['Hutt', 200, 999, 'C']], result = data.map(([name, height, weight, zone]) => ({name, height, weight, zone})); console.log(r); 

暫無
暫無

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

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