如果我有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
上执行此操作。
答案 0 :(得分:7)
如果属性始终为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)
EDIT 基于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)
答案 1 :(得分:4)
您可以通过采用用于构建命名键的属性数组来映射新对象,并使用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; }
答案 2 :(得分:1)
您可以使用Array#map
和Array#reduce
方法。使用Array#map
方法遍历第二个数组,在其中使用Array#reduce
方法生成对象并返回。
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
Calendar cal = Calendar.getInstance();
cal.add(Calendar.DATE, -1);
dateFormat.format(cal.getTime());
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)), {}));
答案 3 :(得分:0)
您可以使用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);