Как создать массив объекта из двух разных по длине массивов javascript

#javascript #arrays

Вопрос:

Как создать массив объекта из двух разных длин массива

например

 arr1 = ["first","second","third","fourth","fifth","Sixth"]
arr2 = [["1","2","3","4","5","6"],["7","8","9","10","11","12"],["1","2","3","4"]]

finalArray = [{
   first:1,
   second:2
   third:3,
   fourth:4,
   fifth:5,
   sixth:6
},{
   first:7,
   second:8
   third:9,
   fourth:10,
   fifth:11,
   sixth:12
}]
 

Я пробовал это с помощью map, но получал каждую пару ключ-значение как целый объект

пример

 [
 {first: 1}
 {second: 2}
 {third: 3}
 {fourth: 4}
]
 

Ответ №1:

С map() помощью и reduce() :

 const arr1 = ["first", "second", "third", "fourth", "fifth", "Sixth"];
const arr2 = [["1", "2", "3", "4", "5", "6"],
              ["7", "8", "9", "10", "11", "12"],
              ["1", "2", "3", "4"]];

const res = arr2.map(v => v.reduce((a, v, i) => ({...a, [arr1[i]]: v}), {}));

console.log(res); 

Комментарии:

1. Я считаю, что это плохой подход, потому что он имеет низкую сложность во время выполнения: вы используете spread-operator (который будет выполнять O(n) копирование массива для каждого входного элемента) reduce .

2. @Dai Вы правы, но для небольших объемов данных разница будет незначительной, и если бы мы стремились к оптимальной производительности во время выполнения, мы бы не использовали ни одну из функций массива, таких как map() or reduce() в любом случае. Еще одна вещь, которую стоит упомянуть, это то, что мы не знаем, какие оптимизации вводит движок JavaScript, поэтому трудно определить фактическую сложность времени выполнения. Без каких-либо оговорок о требованиях к производительности в вопросе я ошибаюсь в отношении краткости и удобочитаемости.

3. Итак, что может быть лучшим подходом, кроме любой предопределенной функции @RobbyCornelissen

4. Повторите, используя только for циклы, регулярные присвоения свойств объектам, нажмите, чтобы добавить в массив.

Ответ №2:

Вы можете воспользоваться Array.prototype.reduce для обновления формы результирующего массива

 let arr1 = ["first","second","third","fourth","fifth","Sixth"];
let arr2 = [["1","2","3","4","5","6"],["7","8","9","10","11","12"],["1","2","3","4"]];

let result = arr2.reduce((accumulator, current) => {
  let obj = arr1.reduce((acc, currentKey, index) => {
    if(current.indexOf(index) amp;amp; current[index] !== undefined ){
      acc[[currentKey]] = current[index];
    }
    return acc;
  }, {});
  return accumulator.concat(obj);
}, []);

console.log(result); 

Ответ №3:

без reduce() и покрытый крайний случай, когда arr1 содержит меньше элементов, чем элемент из arr2

 const arr1 = ["first","second","third","fourth","fifth","Sixth"]
const arr2 = [["1","2","3","4","5","6"],["7","8","9","10","11","12"],["1","2","3","4"]]

const res = arr2.map(values => {
    const res = {}
    for(const [index, value] of arr1.entries()){
        if(values[index]) {
            res[value] = values[index] // or parseInt(values[index])
        } else {
            break
        }
    }
    return res
})

console.dir(res) 

Комментарии:

1. if(values[index]) { — здесь есть ошибка: если values[index] значение является ложным (например 0 ), то ваш for цикл прервется слишком рано.