zummon
zummon

Reputation: 986

how to convert 3d array to 2d array

I want to convert 3d array to 2d array

so I have 3d array look like this

[
  [
    ["creative fee (example)"],
    [1000]
  ],
  [
    ["Item 1...", "Item 2..."],
    [600, 1000]
  ],
  [
    ["Item 3...", "Item 4..."],
    [400, 600]
  ]
]

and want to convert to 2d array like this (expected result)

[
  ["creative fee (example)", 1000],
  ["Item 1...", 600],
  ["Item 2...", 1000],
  ["Item 3...", 400],
  ["Item 4...", 600]
]

this is what I've tried but it begins too hard

var carry = [
  [
    ["creative fee (example)"],
    [1000]
  ],
  [
    ["Item 1...", "Item 2..."],
    [600, 1000]
  ],
  [
    ["Item 3...", "Item 4..."],
    [400, 600]
  ]
],
result = []
for (var z = 0; z < carry.length; z++) {
  for (var m = 0; m < carry[z].length; m++) {
    for (var t = 0; t < carry[z][m].length; t++) {
     // console.log(carry[z][m][t])
     result[z+t] = []
     result[z+t][m] = carry[z][m][t]
    }
  }
}
console.log(result)

Anyways thank you in advance

Upvotes: 2

Views: 2082

Answers (4)

Aadil Mehraj
Aadil Mehraj

Reputation: 2614

By using flatMap:

const result = data.flatMap(([i, j]) => i.map((a, idx) => [a, j[idx]]))

const data = [
      [
        ["creative fee (example)"],
        [1000]
      ],
      [
        ["Item 1...", "Item 2..."],
        [600, 1000]
      ],
      [
        ["Item 3...", "Item 4..."],
        [400, 600]
      ]
    ];

    const result = data.flatMap(([i, j]) => i.map((a, idx) => [a, j[idx]]))

    console.log(result)

Upvotes: 0

geofh
geofh

Reputation: 605

If you need to avoid Array.flatMap (it was introduced in EMCAScript 2019), the old vanilla way would be:

  carry.map(elt => [].concat(...elt))

Upvotes: 2

phoenixstudio
phoenixstudio

Reputation: 2598

This should work for your case, you just need to use the spreed operator(...) to spread items and push them into an array (items) and push the results into an new array (using map in this case)

var array2D = carry.map(el => {
  var items = [];
  el.forEach(e => items.push(...e))
  return items;
});

Upvotes: 2

Nina Scholz
Nina Scholz

Reputation: 386570

You could take a Array#flatMap approach and map pairs.

let data = [[["creative fee (example)"], [1000]], [["Item 1...", "Item 2..."], [600, 1000]], [["Item 3...", "Item 4..."], [400, 600]]],
    result = data.flatMap(([l, r]) => l.map((v, i) => [v, r[i]]));

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

Upvotes: 4

Related Questions