Сопоставление объектов Javascript «один-к-одному» (встроенная функция?) - PullRequest
1 голос
/ 28 марта 2019

Если у меня есть 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[], создавал объект temp и помещал его на statistics[].

Но, поскольку я знаю, все остальные записи в data имеют те же измерения и типы данных. Я также знаю, что есть взаимно-однозначное сопоставление от properties до data. Есть ли встроенная функция в javascript, которая выводит массив объектов с сопоставлением один-к-одному? Нечто подобное properties.mapAll(data) или подобное. Я надеюсь не использовать библиотеку, потому что я делаю это на шаблоне .html в GAS.

Ответы [ 4 ]

7 голосов
/ 28 марта 2019

Если свойства всегда будут name, height, weight & zone, тогда вы можете использовать Разрушение массива , чтобы применить имя заполнителя и сохранить значение в пределах 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)
4 голосов
/ 28 марта 2019

Вы можете отобразить новые объекты, взяв массив свойств для создания именованных ключей и собрав все объекты с помощью 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; }
1 голос
/ 28 марта 2019

Вы можете использовать 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)
0 голосов
/ 28 марта 2019

Вы можете использовать Array Destructuring, чтобы извлечь значения и заменить их именованными свойствами в возвращаемом объекте.

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...