Как создать ассоциативный массив из нескольких массивов?

259
29 ноября 2021, 23:10

Имеются массивы a, b, c, d, e.. Необходимо создать новый массив z, состоящий из пар ключ значение: a1 ->[b1, c1, d1, e1, ...], a2->[b2, c2, d2, e2, ...] Как сделать это более элегантно, без прогонки по цикл в JavaScript?

Answer 1

Если нельзя циклы, то можно, конечно, через рекурсию попробовать:

const arrA = ['a1','a2','a3','a4','a5']; 
const arrB = ['b1','b2','b3','b4','b5']; 
const arrC = ['c1','c2','c3','c4','c5']; 
const arrD = ['d1','d2','d3','d4','d5']; 
const arrE = ['e1','e2','e3','e4','e5']; 
 
const z = []; 
 
function setNewArr(arrA,arrB,arrC,arrD,arrE) { 
  const result = {}; 
  if(arrA.length == 0) { 
    return z; 
  } 
  else { 
    let firstA = arrA.shift(); 
    let newArr = [arrB.shift(), arrC.shift(), arrD.shift(), arrE.shift()]; 
    result[firstA] = newArr; 
    z.push(result); 
    return setNewArr(arrA,arrB,arrC,arrD,arrE); 
  } 
} 
console.log(setNewArr(arrA,arrB,arrC,arrD,arrE));

Answer 2

Ну, если очень не хочется видеть слово for, можно поизвращаться:

let a = ["a1", "a2", "a3", "a4"]; 
let b = ["b1", "b2", "b3", "b4"]; 
let c = ["c1", "c2", "c3", "c4"]; 
let d = ["d1", "d2", "d3", "d4"]; 
let e = ["e1", "e2", "e3", "e4"]; 
 
let obj = Object.fromEntries( a.map( (elem, i) => [ elem, [b[i], c[i], d[i], e[i]] ] ) ); 
 
console.log(obj); 
 
/* a.map( (elem, i) => [ elem, [ b[i], c[i], d[i], e[i] ] ] 
 * Заменяет каждый элемент из `a` на массив вида [элем, [......]] 
 * Собирая в массив [...] элементы под номером `i` из остальных перечисленных массивов 
 * На выходе:  
 *    [ 
 *      ["a1", ["b1", "c1", "d1", "e1"] ], 
 *      ["a2", ["b2", "c2"... ] ], 
 *    ] 
 * 
 * А Object.fromEntries() как-раз требует такой массив из подмассивов [ключ, значение] 
 */

Но оно всё равно за кулисами делает свои циклы. И коротко != элегантно... я бы всё равно выбрал простой и понятный цикл, завернутый в функцию)

Исчо вариант, тоже по сути цикл, зато вызов прикольный:

let a = ["a1", "a2", "a3", "a4"]; 
let b = ["b1", "b2", "b3", "b4"]; 
let c = ["c1", "c2", "c3", "c4"]; 
let d = ["d1", "d2", "d3", "d4"]; 
let e = ["e1", "e2", "e3", "e4"]; 
 
console.log( objKeys(a).values(b, c, d, e) ); 
 
/***/ 
 
function objKeys(arr){ 
 
  objKeys.values = function (...arrays){ 
    return arr.reduce( (obj, elem, i) => { 
      obj[ elem ] = arrays.map( e => e[i] ); 
      return obj; 
    }, {}); 
  } 
   
  return objKeys; 
}

Answer 3

Можно сделать проще, но я думаю читабельность у данного кода достаточна

const arrA = ['a1','a2','a3','a4','a5']; 
const arrB = ['b1','b2','b3','b4','b5']; 
const arrC = ['c1','c2','c3','c4','c5']; 
const arrD = ['d1','d2','d3','d4','d5']; 
const arrE = ['e1','e2','e3','e4','e5']; 
 
const arrs = [arrB, arrC, arrD, arrE]; 
 
var result = {}; 
 
arrA.forEach((e, i) => { 
  result[e] = arrs.map(e => e[i]); 
}) 
 
console.log(result);

Answer 4

там песочница

const arrA = ['a1', 'a2', 'a3', 'a4', 'a5'];
const arrB = ['b1', 'b2', 'b3', 'b4', 'b5'];
const arrC = ['c1', 'c2', 'c3', 'c4', 'c5'];
const arrD = ['d1', 'd2', 'd3', 'd4', 'd5'];
const arrE = ['e1', 'e2', 'e3', 'e4', 'e5'];
// --
// --
type $matrix<T> = T[][];
// --
type $matrix2map = ([keys, ...q]: $matrix<string>) => Map<string, string[]>
const matrix2map: $matrix2map = ([keys, ...q]) => new Map(keys.map((k, i) => [k, q.map(q => q[i])]))
// --
type $matrix2obj = ([keys, ...q]: $matrix<string>) => { [k: string]: string[] }
const matrix2obj: $matrix2obj = ([keys, ...q]) => Object.fromEntries(keys.map((k, i) => [k, q.map(q => q[i])]))
// --
// --
const log = (...q: any[]) => (console.log(...q), log)
const matrix = [arrA, arrB, arrC, arrD, arrE,];
// --
log
    ('matrix2map', matrix2map(matrix))
    ('matrix2obj', matrix2obj(matrix))
    ;

const arrA = ['a1', 'a2', 'a3', 'a4', 'a5']; 
const arrB = ['b1', 'b2', 'b3', 'b4', 'b5']; 
const arrC = ['c1', 'c2', 'c3', 'c4', 'c5']; 
const arrD = ['d1', 'd2', 'd3', 'd4', 'd5']; 
const arrE = ['e1', 'e2', 'e3', 'e4', 'e5']; 
// -- 
// -- 
const matrix2map = ([keys, ...q]) => new Map(keys.map((k, i) => [k, q.map(q => q[i])])); 
const matrix2obj = ([keys, ...q]) => Object.fromEntries(keys.map((k, i) => [k, q.map(q => q[i])])); 
// -- 
// -- 
const log = (...q) => (console.log(...q), log); 
const matrix = [arrA, arrB, arrC, arrD, arrE, ]; 
// -- 
log 
  ('matrix2map', matrix2map(matrix)) // смотри консоль браузера 
  ('matrix2obj', matrix2obj(matrix)) 
  ;

READ ALSO
Удалить первую ссылку HTML

Удалить первую ссылку HTML

Как удалить первую ссылку в HTML с помощью JavaScript? Думаю нужно выбрать первый элемент и удалить его, помогите с кодом

205
поле и кнопка пропадают при нажатии

поле и кнопка пропадают при нажатии

как сделать чтобы хекс код и сам цвет отображались под полем после нажатия?после нажатия поле и кнопка пропадают

100
Что такое for в bootstrap 4, type, id =&quot;&quot;

Что такое for в bootstrap 4, type, id =""

Изучаю bootstrap 4 Есть несколько строк:

148