Javascript一对一对象映射(内置函数?)

时间:2019-03-28 09:51:19

标签: javascript arrays object google-apps-script

如果我有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上执行此操作。

4 个答案:

答案 0 :(得分:7)

如果属性始终为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)

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#mapArray#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);