#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:
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()
orreduce()
в любом случае. Еще одна вещь, которую стоит упомянуть, это то, что мы не знаем, какие оптимизации вводит движок 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
цикл прервется слишком рано.