[英]Why is the `prototype` field of the built-in Object function treated differently in JavaScript?
[英]Javascript One-To-One Object Mapping (Built-in Function?)
如果我有2個數組( properties
和data
):
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
中的所有其他條目都具有相同的維度和數據類型。 我也知道從properties
到data
一對一的映射。 javascript中是否有內置功能,可以通過一對一映射輸出對象數組? 類似於properties.mapAll(data)
類的東西。 我希望不使用庫,因為我正在GAS中的模板.html
上執行此操作。
如果屬性始終是name
, height
, weight
和zone
那么您可以使用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#map
和Array#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.