Как преобразовать один массив в несколько вложенных массивов для использования метода срезов - PullRequest
0 голосов
/ 09 января 2020

enter image description here

Я получил список одномерного массива и хочу переделать его, как показано ниже.

data = [[0,1,2,3,4,5,6,7,8], [9,10,11,12,13,14,15,16,17],. .., [88,89,90,91,92,93,94,95,96]]

, а затем я хочу выбрать каждый из вложенных данных [i] и разделить элементы внутри на 3 , 6.

Наконец, я хочу создать два новых массива, нажав нарезанный массив.

например, данные [0] = [0,1,2,3,4,5,6,7,8]

new_data1 = [], new_data2 = []

new_data1.pushing (данные [0] .slice (0,2))

new_data2.pushing (данные [0] .slice (3,8))


new_data1 = [0,1,2,9,10,11,19,20,21, ...]

new_data2 = [3,4,5,6,7,8,12,13,14 , 15,16,17,18,22,23, ...]

Это то, что я хочу сделать. Я могу создать новый массив, используя setState или hooks.

Ответы [ 4 ]

0 голосов
/ 04 марта 2020

Вы сказали, что одномерный массив, но данные - это двумерный массив. Поэтому я делаю пример с двумерным массивом:

const input = Array.from({length: 11}, (v1,i1) => Array.from({length: 9}, (v2, i2) => i1*9+i2));
// [[0,1,2,3,4,5,6,7,8],[9,10,11,12,13,14,15,16,17],...,[90, 91, 92, 93, 94, 95, 96, 97, 98]]

const new_data1 = [];
const new_data2 = [];
for (const values of input) {
    new_data1.push(...values.slice(0, 3));
    new_data2.push(...values.slice(3));
}

// res:
// new_data1 = [0, 1, 2, 9, 10, 11, 18, 19, 20, ..., 72, 73, 74, 81, 82, 83, 90, 91, 92]
// new_data2 = [3, 4, 5, 6, 7, 8, 12, 13, 14, ..., 87, 88, 89, 93, 94, 95, 96, 97, 98]
0 голосов
/ 09 января 2020

Вот мое решение

// grouping elements into 2-dimentional array
const grouped = data.reduce((prev, curr, index) => {
    const idx = parseInt(index / 9)
    if (prev[idx]) {
        prev[idx].push(curr)
    } else {
        prev[idx] = [curr]
    }
    return prev
}, [])

// generate new arrays
const dataset1 = [], dataset2 = []
for (let group of grouped) {
    dataset1.push(...group.slice(0, 3))
    dataset2.push(...group.slice(3, 9))
}
0 голосов
/ 09 января 2020

Один из способов сделать

// Generate input sample data from 0 to 96 [0, 1, 2, .... 95]
const data = new Array(96).fill(0).map((_,i) => i);

let new_data1 = [];
let new_data2 = [];
let i = 0;

while (i < (96 - 9)) {
  new_data1.push(...data.slice(i, i+3));
  new_data2.push(...data.slice(i+3, i+9))
  i += 9;
}


console.log('data1-->', JSON.stringify(new_data1));
console.log('data2-->', JSON.stringify(new_data2));
0 голосов
/ 09 января 2020

let array = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96];

let lengths = [3, 6];
let batches = lengths.map(() => []);
for (let i = 0; array.length; i = 1 - i)
  batches[i] = batches[i].concat(array.splice(0, lengths[i]));
console.log(batches);
// let [new_data1, new_data2] = batches;

Кстати, ваш пример вывода отключен на 1. 18 должно быть в new_data1, а не new_data2. Точно так же 21 должен перейти на new_data2

...