Cara membuat array dari array [ditutup]

33

Saya seorang pemula JavaScript dan saya mencoba membuat dua array berbeda dengan nilai-nilai dari satu array utama.

Array utama saya terlihat seperti:

0: Array(3) [ 2011, 127072.7, 51584 ]
1: Array(3) [ 2012, 125920.3, 59974 ]
2: Array(3) [ 2013, 129305.4, 15468 ]
3: Array(3) [ 2014, 135364, 84554 ]
4: Array(3) [ 2015, 136757, 98754 ]
5: Array(3) [ 2016, 155653.5, 155548 ]
6: Array(3) [ 2017, 164130.5, 284848 ]

Dan saya perlu membuat dua array, pertama terlihat seperti:

0: Array(2) [ 2011, 127072.7]
1: Array(2) [ 2012, 125920.3]
2: Array(2) [ 2013, 129305.4]
3: Array(2) [ 2014, 135364]
4: Array(2) [ 2015, 136757]
5: Array(2) [ 2016, 155653.5]
6: Array(2) [ 2017, 164130.5]

(nilai pertama dan kedua)

dan kedua seperti:

0: Array(2) [ 2011, 51584]
1: Array(2) [ 2012, 59974]
2: Array(2) [ 2013, 15468]
3: Array(2) [ 2014, 84554]
4: Array(2) [ 2015, 98754]
5: Array(2) [ 2016, 155548]
6: Array(2) [ 2017, 284848]

(nilai pertama dan ketiga)

Saya mencoba sambungan, filter dll. Tapi saya tidak tahu, bagaimana memulainya.

Tidak perlu menulis saya solusi yang tepat, tetapi hanya langkah bagaimana melakukannya.

Dominik Lev
sumber
Terima kasih banyak atas jawaban yang bagus. Mereka bekerja dengan baik. Saya mungkin punya satu pertanyaan untuk masa depan. Bisakah itu dilakukan agar tidak diperbaiki ke dua bidang? Tetapi bahkan tiga, empat, dll?
Dominik Lev
3
Apa masalah sebenarnya yang Anda coba selesaikan di sini? Sepertinya menggunakan array objek adalah pilihan yang lebih baik.
BlueRaja - Danny Pflughoeft
Saran: alih-alih memiliki tahun eksplisit berturut-turut dalam array Anda, Anda bisa meminta tahun tersebut tersirat dari titik awal yang diberikan. Maka Anda hanya perlu satu titik awal skalar, dan tahun untuk elemen apa pun diketahui berdasarkan indeks lariknya. (Hanya berfungsi jika tahun-tahun Anda selalu berdampingan dan dalam urutan naik seperti contoh ini. Tetapi apakah baik menyederhanakan dari array pasangan ke hanya array angka primitif.)
Peter Cordes

Jawaban:

29

Anda bisa mengambil pendekatan dinamis dan mendapatkan semua item dari array setelah nilai kunci untuk setiap array baru.

var data = [[2011, 127072.7, 51584], [2012, 125920.3, 59974], [2013, 129305.4, 15468], [2014, 135364, 84554], [2015, 136757, 98754], [2016, 155653.5, 155548], [2017, 164130.5, 284848]],
    [first, second] = data.reduce(
        (r, [k, ...a]) => {
            a.forEach((v, i) => r[i].push([k, v]));
            return r;
        },
        Array.from({ length: Array.isArray(data[0]) ? data[0].length - 1 : 0 }, () => [])
    );

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

Nina Scholz
sumber
Terima kasih banyak atas jawaban yang bagus. Bisakah saya memiliki pertanyaan untuk masa depan? Apakah mungkin untuk memperbaikinya tidak hanya pada 2 array tetapi juga pada lebih banyak?
Dominik Lev
1
Anda bisa mengganti [first, second]dengan arraydan Anda mendapatkan array dengan semua kolom data sebagai array.
Nina Scholz
2
Alih-alih itu agak lambat, r[i] = r[i] || []Anda hanya harus menggunakan Array.from({length: (data[0]?.length ?? 1) - 1}, () => [])untuk nilai akumulator awal
Bergi
3
@NinaScholz Tidak, saya maksudkan bahwa Anda memeriksa jika r[i]ada di setiap pengulangan, sedangkan Anda cukup membuat array hasil yang diperlukan di luar reducepanggilan.
Bergi
1
@Klaycon Tidak, akses array di luar batas array sangat lambat, jadi "periksa apakah sudah ada" tidak berfungsi dengan baik. Komentar saya tidak dimaksudkan untuk mengkhawatirkan kinerja, tetapi lebih memilih kode yang bersih dan dapat diprediksi (benar). Saya pertama kali menulis "agak jelek dan lambat" sebelum menyadari bahwa saran saya yang membuat berurusan dengan kasing kosong eksplisit juga bukan keindahan yang nyata.
Bergi
14

Anda dapat menggunakannya .map()untuk beralih pada data Anda dan menggunakan beberapa Array Destrukturisasi untuk mendapatkan hasil yang diinginkan:

const data = [
  [ 2011, 127072.7, 51584 ],
  [ 2012, 125920.3, 59974 ],
  [ 2013, 129305.4, 15468 ],
  [ 2014, 135364, 84554 ],
  [ 2015, 136757, 98754 ],
  [ 2016, 155653.5, 155548 ],
  [ 2017, 164130.5, 284848 ]
];

const arr1 = data.map(([year, val]) => ([year, val]));
const arr2 = data.map(([year, _, val]) => ([year, val]));

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

Mohammad Usman
sumber
Terima kasih banyak atas jawaban yang bagus. Bisakah saya memiliki pertanyaan untuk masa depan? Apakah mungkin untuk memperbaikinya tidak hanya pada 2 array tetapi juga pada lebih banyak?
Dominik Lev
1
@DominikLev Dalam hal ini Anda dapat menggunakan jawaban yang diposting oleh Nina. Itu bagus.
Mohammad Usman
1
Ini dapat digeneralisasi menggunakan sintaks parameter sisanya ke([year, ...values]) => [year, values[n]]
JollyJoker
@JollyJoker - Anda harus memposting itu sebagai jawaban, itu adalah solusi umum yang sangat bagus dan ringkas
Filip Milovanović
@ FilipMilovanović Saya sudah melakukan stackoverflow.com/a/60166014/7126740
JollyJoker
6

Anda dapat menggunakannya Array.prototype.forEachuntuk beralih pada item array asli, lalu membuat item baru dan mendorongnya ke dalam array baru:

var original = [[ 2011, 127072.7, 51584 ], [ 2012, 125920.3, 59974 ], [ 2013, 129305.4, 15468 ]]

var array1 = []
var array2 = []

original.forEach(item => {
  array1.push([item[0], item[1]]);
  array2.push([item[0], item[2]]);
});

console.log(array1);
console.log(array2);

Keluaran:

masukkan deskripsi gambar di sini


Membuat array kami secara dinamis sehingga solusinya bekerja tidak peduli berapa banyak item yang dimiliki array asli:

var original = [
  [2011, 127072.7, 51584, 1, 2, 3],
  [2012, 125920.3, 59974, 4, 5, 6],
  [2013, 129305.4, 15468, 7, 8, 9]
]

// Array of arrays
var myArray = []

// Fill it with empty arrays
for (var i = 0; i < original[0].length - 1; i++)
  myArray.push([])

// Iterate over original
// For each original, insert the first and i-th element into our array of arrays
original.forEach(item => {
  for (var i = 1; i < item.length; i++) {
    myArray[i - 1].push([item[0], item[i]]);
  }
});

console.log(myArray);

Keluaran: masukkan deskripsi gambar di sini

Ismael Padilla
sumber
Terima kasih banyak atas jawaban yang bagus. Bisakah saya memiliki pertanyaan untuk masa depan? Apakah mungkin untuk memperbaikinya tidak hanya pada 2 array tetapi juga pada lebih banyak?
Dominik Lev
1
Dimungkinkan untuk membuat array secara dinamis tanpa mengetahui sebelumnya berapa banyak item yang akan dimiliki oleh array asli. Lihatlah jawaban saya yang diedit :)
Ismael Padilla
4

Pertama-tama, Anda memiliki array array di awal. Anda bisa mapmenggunakan array ini untuk dua array berbeda destructuringuntuk mendapatkan masing-masing nilai dari subarrays secara ringkas:

const data = [
  [ 2011, 127072.7, 51584 ],
  [ 2012, 125920.3, 59974 ],
  [ 2013, 129305.4, 15468 ],
  [ 2014, 135364, 84554 ],
  [ 2015, 136757, 98754 ],
  [ 2016, 155653.5, 155548 ],
  [ 2017, 164130.5, 284848 ],
];

const array1 = data.map(([first, second, third]) => [first, second]);
const array2 = data.map(([first, second, third]) => [first, third]);

console.log(JSON.stringify(array1));
console.log(JSON.stringify(array2));

Alberto Trindade Tavares
sumber
4

Ulangi array utama dan kembalikan array baru dengan menggunakan nilai indeks tetap untuk mengakses nilai array anak Anda.

const multiDimArr = [
  [2011, 127072.7, 51584],
  [2012, 125920.3, 59974],
  [2013, 129305.4, 15468],
  [2014, 135364, 84554],
  [2015, 136757, 98754],
  [2016, 155653.5, 155548],
  [2017, 164130.5, 284848],
]

const arr1= multiDimArr.map(x=>[x[0],x[1]]);
const arr2= multiDimArr.map(x=>[x[0],x[2]]);

console.log(arr1)
console.log(arr2)

Eugen Sunic
sumber
3

Anda dapat menggunakan pengurangan fungsi sebagai berikut yang hanya dilakukan sekali:

let matrix = [[ 2011, 127072.7, 51584 ],[ 2012, 125920.3, 59974 ],[ 2013, 129305.4, 15468 ],[ 2014, 135364, 84554 ],[ 2015, 136757, 98754 ],[ 2016, 155653.5, 155548 ],[ 2017, 164130.5, 284848 ]];

let result = matrix.reduce((a, [year, k, v]) => {
  a.second.push([year, k]);
  a.third.push([year, v]);
  return a;
}, {second: [], third: []});

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

Ele
sumber
Mengapa CSS dalam jawaban ini?
Joshua Fox
1
@ JoshuaFox hanya untuk memperluas ketinggian konsol.
Sebelas
3

Ini dia

let values = [[ 2011, 127072.7, 51584 ],[ 2012, 125920.3, 59974 ],[ 2013, 129305.4, 15468 ],[ 2014, 135364, 84554 ],[ 2015, 136757, 98754 ],[ 2016, 155653.5, 155548 ],[ 2017, 164130.5, 284848 ]];

let chunk1 = values.map(arr1 => {
  return [arr1[0], arr1[1]]
});
let chunk2 = values.map(arr1 => {
  return [arr1[0], arr1[2]]
})

console.log("Chunk 1", chunk1);
console.log("Chunk 2", chunk2);

Muhammad Zeeshan
sumber
2

Saya telah menggunakan peta untuk loop, dua array untuk mendorong nilai yang dibutuhkan.

let point_table = []
let integer_table = []
const historical_table = [
  [2011, 127072.7, 51584],
  [2012, 125920.3, 59974],
  [2013, 129305.4, 15468],
  [2014, 135364, 84554],
  [2015, 136757, 98754],
  [2016, 155653.5, 155548],
  [2017, 164130.5, 284848]
]
historical_table.map(row => {
  point_table.push([row[0], row[1]])
  integer_table.push([row[0], row[2]])
})
console.log(point_table, integer_table)

iEfimoff
sumber
1

solusi lain:

 const original= [  [ 2011, 127072.7, 51584 ], [ 2012, 125920.3, 59974 ],[ 2013, 129305.4, 15468 ],  [ 2014, 135364, 84554 ],  [ 2015, 136757, 98754 ],  [ 2016, 155653.5, 155548 ],  [ 2017, 164130.5, 284848 ]];

original.map (x => [[x [0], x [1]], [x [0], x [2]]]) .reduce ((a, b) => a.concat (b), [])

Cem Tuğut
sumber
1

Untuk solusi generik, saya pikir membangun array indeks untuk kolom nilai memberi Anda cara sederhana memetakan data lengkap ke array yang Anda inginkan.

[...data[0].keys()].slice(0,-1)

memberi Anda array indeks, minus satu kolom pada tahun itu, dan

n => data.map(([year, ...values]) => [year, values[n]])

memberi Anda array yang Anda inginkan untuk kolom nilai ke-n. Begitu:

var data = [[2011, 127072.7, 51584], [2012, 125920.3, 59974], [2013, 129305.4, 15468], [2014, 135364, 84554], [2015, 136757, 98754], [2016, 155653.5, 155548], [2017, 164130.5, 284848]]

const yearArrays = arr => [...arr[0].keys()].slice(0,-1)
       .map(arr.map(([year, ...values]) => [year, values[n]]))

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

JollyJoker
sumber
0

Solusi lain untuk array input dengan panjang generik.

const input = [[1,11,111,1111],[2,22,222,2222]];

const result = input.reduce((accumulator, [head, ...tail]) => {
  tail.forEach((item, index) => {
    accumulator[index] = accumulator[index] || [];
    accumulator[index].push([head, item]);
  });
  return accumulator;
}, [])

console.log(result);

Linus
sumber
0

Gunakan solusi ini untuk membuat kombinasi generik dari array multi dimensi yang ada. Anda harus melewati indeks item untuk dipilih secara eksplisit dan itulah yang membuatnya generik.

    const multiDimArr = [
      [2011, 127072.7, 51584],
      [2012, 125920.3, 59974],
      [2013, 129305.4, 15468],
      [2014, 135364, 84554],
      [2015, 136757, 98754],
      [2016, 155653.5, 155548],
      [2017, 164130.5, 284848],
    ]


    function arrayCombo (idxA, idxB){
      return multiDimArr.map(x=>[x[idxA],x[idxB]]);
    }

    console.log(arrayCombo(0, 1));
    console.log(arrayCombo(0, 2));
    console.log(arrayCombo(1, 2));

rach8garg
sumber