Как объединить 2 массива в 1 объект JavaScript

1

У меня есть 2 массива, которые я хочу "уменьшить" в 1 объект.

так, например:

Я имею..

var originalData = [1,2,3];

var newData = [3,1,2];

я хочу объединить эти два массива в объект, который выглядит следующим образом:

var newOrderObject = {1:3, 2:1, 3:2};

Я использую функцию редукции, но кажется, что они отображаются по-разному.

var newOrderObject = originalData.reduce(function(newData) {
  var orderObject = {};
  originalData = newData;
  return orderObject;
}, {});

любые предложения будут оценены

Показать ещё 1 комментарий
Теги:
arrays
reduce

5 ответов

6
Лучший ответ

Уменьшите 1-й массив (ключи) и возьмите значения из 2-го массива, используя index:

var originalData = [1,2,3];
var newData = [3,1,2];

var newOrderObject = originalData.reduce(function(obj, key, index) {
  obj[key] = newData[index];
  return obj;
}, {});

console.log(newOrderObject);
3

Вы просто используете. .reduce неправильно.

  • Первым аргументом этого обратного вызова является объект-аккумулятор, который вы передаете.
  • 2-й является текущим итерированным элементом.
  • 3-й это индекс.

Используйте все 3, и вы получите желаемый результат.

var originalData = [1,2,3];
var newData = [3,1,2];

var newOrderObject = originalData.reduce(function(acc, item, i) {
  return Object.assign(acc, { [item]: newData[i] })
}, {});

console.log(newOrderObject)
3

Вы можете сопоставить отдельные объекты и назначить их одному объекту. Если возможны пустые массивы, используйте пустой объект в качестве целевого значения.

var keys = [1, 2, 3],
    values = [3, 1, 2],
    object = Object.assign({}, ...keys.map((k, i) => ({ [k]: values[i] })));

console.log(object);

Более чистым подходом было бы перенести массивы в массив пар ключ/значение, а затем отобразить объект.

const transpose = (r, a) => a.map((v, i) => (r[i] || []).concat(v));

var keys = [1, 2, 3],
    values = [3, 1, 2],
    object = Object.assign(
        {},
        ...[keys, values]
            .reduce(transpose, [])
            .map(([k, v]) => ({ [k]: v }))
    );

console.log(object);
  • 0
    @Shidersz, с пустым объектом в качестве целевого объекта, он работает с пустыми массивами.
0

var originalData = [1, 2, 3];

var newData = [3, 1, 2];

var newarray = newData.reduce(function(result, field, index) {
  result[originalData[index]] = field;
  return result;
}, {})

console.log(newarray);
0

Это еще одна альтернатива для того, что вы ищете, без использования .reduce

var originalData = [1, 2, 3];
var newData = [3, 1, 2];

var result = {};
originalData.forEach((key, i) => result[key] = newData[i]);

console.log(result);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню