배열에서 배열을 만드는 방법 [closed]


33

저는 JavaScript 초보자이며 하나의 기본 배열에서 값을 가진 두 개의 다른 배열을 만들려고합니다.

내 주요 배열은 다음과 같습니다.

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 ]

그리고 먼저 다음과 같이 두 개의 배열을 만들어야합니다.

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]

(제 1 값 및 제 2 값)

두 번째는 다음과 같습니다.

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]

(제 1 및 제 3 가치)

스플 라이스, 필터 등을 시도했지만 시작 방법을 모르겠습니다.

나에게 정확한 해결책을 쓸 필요는 없지만 그것을 수행하는 단계 만 있습니다.


큰 답변에 감사드립니다. 그들은 잘 작동합니다. 미래에 대한 하나의 질문이있을 수 있습니다. 두 필드에 고정되지 않도록 할 수 있습니까? 그러나 심지어 3, 4 등?
도미니크 레프

3
여기서 해결하려는 실제 문제는 무엇입니까? 객체 배열을 사용하는 것이 더 나은 옵션 인 것 같습니다.
BlueRaja-대니 Pflughoeft

제안 : 배열에서 연속적인 연도를 갖는 대신 주어진 시작점에서 연도를 암시 적으로 나타낼 수 있습니다. 그런 다음 하나의 스칼라 시작점이 필요하며 모든 요소의 연도는 배열 색인을 기반으로 알려져 있습니다. (여러 해가이 예제와 같이 항상 연속적이고 오름차순 인 경우에만 작동합니다. 그러나 한 쌍의 배열에서 기본 숫자의 배열로 멋지게 단순화합니다.)
Peter Cordes

답변:


29

동적 접근 방식을 사용하여 각 새 배열의 키 값 다음에 배열의 모든 항목을 가져올 수 있습니다.

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; }


큰 답변을 주셔서 감사합니다. 미래에 대한 질문이 있습니까? 2 개의 배열뿐만 아니라 더 많은 배열에서 고정시킬 수 있습니까?
도미니크 레프

1
당신은 대체 할 수 [first, second]와 함께 array당신은 배열로 모든 데이터 열 배열을 얻는다.
Nina Scholz

2
오히려 느리게하는 대신 초기 누산기 값으로 r[i] = r[i] || []사용해야 Array.from({length: (data[0]?.length ?? 1) - 1}, () => [])합니다
Bergi

3
@ NinaScholz 아니요, r[i]모든 루프 반복에 존재 하는지 확인하는 반면 reduce호출 외부에서 필요한 결과 배열을 간단히 만들 수 있습니다 .
Bergi

1
@ Klaycon 아니요, 배열 범위를 벗어난 배열 액세스는 매우 느리므로 "이미 존재하는지 확인"이 제대로 작동하지 않습니다. 내 의견은 성능에 대해 걱정하는 것이 아니라 깨끗하고 예측 가능한 (올바른) 코드를 선호하는 것입니다. 나는 빈 케이스를 명시 적으로 다루는 나의 제안도 실제적인 아름다움이 아니라는 것을 깨닫기 전에 "가끔 추악하고 느리게"썼다.
Bergi

14

당신이 사용할 수있는 .map()데이터를 반복하는 일부 사용 배열 Destructuring을 원하는 출력을 얻을 :

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; }


큰 답변을 주셔서 감사합니다. 미래에 대한 질문이 있습니까? 2 개의 배열뿐만 아니라 더 많은 배열에서 고정시킬 수 있습니까?
도미니크 레프

1
@DominikLev이 경우 Nina가 게시 한 답변을 사용할 수 있습니다. 좋은 것입니다.
Mohammad Usman

1
나머지 매개 변수 구문 을 사용 하여 일반화 할 수 있습니다.([year, ...values]) => [year, values[n]]
JollyJoker

@JollyJoker-답변으로 게시해야합니다. 정말 훌륭하고 간결한 일반화 된 솔루션입니다.
Filip Milovanović

@ FilipMilovanović 나는 이미 stackoverflow.com/a/60166014/7126740
JollyJoker

6

당신이 사용할 수있는 Array.prototype.forEach다음 새 항목을 만들고 새로운 배열로 밀어, 원래 배열의 항목을 반복 :

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);

산출:

여기에 이미지 설명을 입력하십시오


배열이 동적으로 생성되므로 원래 배열의 항목 수에 관계없이 솔루션이 작동합니다.

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);

산출: 여기에 이미지 설명을 입력하십시오


큰 답변을 주셔서 감사합니다. 미래에 대한 질문이 있습니까? 2 개의 배열뿐만 아니라 더 많은 배열에서 고정시킬 수 있습니까?
도미니크 레프

1
원래 배열에 몇 개의 항목이 있는지 미리 알지 않고도 배열을 동적으로 생성 할 수 있습니다. 내 편집 답변을 살펴보십시오 :)
Ismael Padilla 14:55의

4

우선, 처음에는 배열 배열이 있습니다. 당신은 수있는 map두 개의 서로 다른 배열이 배열을 사용하여 destructuring간결한 방식에서 하위 어레이에서 각 값을 얻을 :

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));


4

기본 배열을 반복하고 고정 인덱스 값을 사용하여 새 배열을 반환하여 자식 배열 값에 액세스하십시오.

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)


3

다음과 같이 reduce 함수를 한 번만 반복하여 사용할 수 있습니다.

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; }


이 답변의 CSS가 왜 필요한가요?
Joshua Fox

1
콘솔의 높이를 늘리기위한 @JoshuaFox
Ele

3

여기 요

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);


2

필요한 값을 푸시하기 위해 map for loop, 두 개의 배열을 사용했습니다.

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)


1

다른 해결책 :

 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), [])


1

일반적인 솔루션의 경우 값 열에 대한 인덱스 배열을 작성하면 전체 데이터를 원하는 배열에 간단하게 매핑 할 수 있습니다.

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

연도의 한 열을 뺀 인덱스 배열을 제공합니다.

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

n 번째 값 열에 원하는 배열을 제공합니다. 그래서:

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; }


0

일반적인 길이의 입력 배열을위한 또 다른 솔루션입니다.

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);


0

기존의 다차원 배열에서 일반적인 조합을 만들려면이 솔루션을 사용하십시오. 명시 적으로 선택하려면 항목 색인을 전달해야하므로 그것이 일반화됩니다.

    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));

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.