1 Востаннє редагувалося cheappi386 (25.01.2021 14:23:12)

Тема: Як максимально швидко раздербанити масив ?

Наприклад є якийсь масив

var dataArr = JSON.parse(data);

в якого кожна комірка це структура с кількома змінними

dataArr[0].val1;
dataArr[0].val2;
dataArr[0].valN;

Чи можна його швидко розбити на окремі масиви, без циклу ?
PS: помилився розділом, прохання перенести до JS

2

Re: Як максимально швидко раздербанити масив ?

1. Що значить "на окремі масиви"?

var val1 = [dataArr[0].val1, dataArr[1].val1, ...]
var val2 = [dataArr[0].val2, dataArr[1].val2, ...]
...
var valN = [dataArr[0].valN, dataArr[1].valN, ...]

Я правильно зрозумів?
2. Що значить "швидко, без циклу"? Без циклу взагалі - точно не вийде. Цикл можна замаскувати різними map-ами, але там усе одно буде масив усередині; і досить висока ймовірність, що такий код буде повільнішим за цикли (хоч і коротшим).
3. Ну і зрештою ви матимете або купу змінних (як на початку, в п.1), які складно обробити одним виразом, або якусь структуру даних (наприклад, знову ж таки, масив), що містить усі ці масиви.

3

Re: Як максимально швидко раздербанити масив ?

Object.values()

повертає значення об'єкту у вигляді масиву

const arrayOfArrays = dataArr.map(obj => Object.values(obj)); // можна переписати як dataArr.map(Object.values)
// це в нас буде один масив, елементи котрого є масивами, шо містять оті ваші val1, val2,... valN
Подякували: koala1

4

Re: Як максимально швидко раздербанити масив ?

FakiNyan написав:
Object.values()

повертає значення об'єкту у вигляді масиву

const arrayOfArrays = dataArr.map(obj => Object.values(obj)); // можна переписати як dataArr.map(Object.values)
// це в нас буде один масив, елементи котрого є масивами, шо містять оті ваші val1, val2,... valN

що тоді буде ключами ?

5

Re: Як максимально швидко раздербанити масив ?

cheappi386 написав:
FakiNyan написав:
Object.values()

повертає значення об'єкту у вигляді масиву

const arrayOfArrays = dataArr.map(obj => Object.values(obj)); // можна переписати як dataArr.map(Object.values)
// це в нас буде один масив, елементи котрого є масивами, шо містять оті ваші val1, val2,... valN

що тоді буде ключами ?

Індекси, що ж ще. 0,1,2,...N

6

Re: Як максимально швидко раздербанити масив ?

N-1?

7

Re: Як максимально швидко раздербанити масив ?

Не працює.Й з цього https://developer.mozilla.org/en-US/doc … /Array/map я не розумію чого воно так взагалі мало би працювати ?

8

Re: Як максимально швидко раздербанити масив ?

cheappi386 написав:

Не працює.Й з цього https://developer.mozilla.org/en-US/doc … /Array/map я не розумію чого воно так взагалі мало би працювати ?

Схоже, що проблема в користувачі.

9

Re: Як максимально швидко раздербанити масив ?

FakiNyan написав:
cheappi386 написав:

Не працює.Й з цього https://developer.mozilla.org/en-US/doc … /Array/map я не розумію чого воно так взагалі мало би працювати ?

Схоже, що проблема в користувачі.

А можна просто, без надування щок, пояснити як воно має працювати ?

10

Re: Як максимально швидко раздербанити масив ?

cheappi386 написав:
FakiNyan написав:
cheappi386 написав:

Не працює.Й з цього https://developer.mozilla.org/en-US/doc … /Array/map я не розумію чого воно так взагалі мало би працювати ?

Схоже, що проблема в користувачі.

А можна просто, без надування щок, пояснити як воно має працювати ?

Так ви ж нічого конкретного не питаєте, а просто кажете - "не робе, нічо не пойняв"

Подякували: leofun011

11

Re: Як максимально швидко раздербанити масив ?

dataArr.map(Object.values)

12

Re: Як максимально швидко раздербанити масив ?

mikeos написав:
dataArr.map(Object.values)

вище вже була пропозиція. По факту виходить - рандомний набір шматків похідного масиву, а не набір масивів з елементів структури (яка є елементом похідного масиву).

13

Re: Як максимально швидко раздербанити масив ?

cheappi386 написав:
mikeos написав:
dataArr.map(Object.values)

вище вже була пропозиція. По факту виходить - рандомний набір шматків похідного масиву, а не набір масивів з елементів структури (яка є елементом похідного масиву).

Так ти конкретно задай питання з прикладом вхідні дані і вихідні дані, бо не зрозуміло що ти хочеш

Подякували: leofun011

14

Re: Як максимально швидко раздербанити масив ?

У чому недолік Object.values:

> Object.values({'q':1,'w':2, 'e':3})
[ 1, 2, 3 ]
> Object.values({'q':1,'e':2, 'w':3})
[ 1, 2, 3 ]

Тобто, хоча значення елементів і будуть у тому ж порядку, що й ключі (Object.keys), самий цей порядок довільний — ключі не сортуються, а йдуть у тому порядку, в якому їх розмістили.

15

Re: Як максимально швидко раздербанити масив ?

mikeos написав:
cheappi386 написав:
mikeos написав:
dataArr.map(Object.values)

вище вже була пропозиція. По факту виходить - рандомний набір шматків похідного масиву, а не набір масивів з елементів структури (яка є елементом похідного масиву).

Так ти конкретно задай питання з прикладом вхідні дані і вихідні дані, бо не зрозуміло що ти хочеш

Плануєте картинно тупити, поки прямий доступ до користувацьких даних не вициганите?  *JOKINGLY*

Загальна постановка задачі зрозуміла: на вході — масив об'єктів однакової структури (тобто, з однаковими іменами полів), на виході — декілька масивів, кожен з яких збирає значення всіх полів з певним іменем.

Якщо імена полів відомі (нехай це value1, value2, valueN), а кожен масив слід розмістити в окремій змінній, то це можна зробити десь так:

allValue1=dataArr.map(o=>o.value1);
allValue2=dataArr.map(o=>o.value2);
allValueN=dataArr.map(o=>o.valueN);

Яка саме потрібна кінцева структура результату (окремі змінні, масив зі стовпчиків таблиці, масив з рядків таблиці...) — тут автор теми нехай уточнить.
Можливо, існують якісь кращі способи — скажімо, якби це був python, я б використав функцію zip (не знаю, чи є щось подібне в JS), щоб не розписувати кожен прохід масиву окрему, а зібрати їх разом, а потім транспонувати кінцеву таблицю.

16

Re: Як максимально швидко раздербанити масив ?

P.Y. написав:

... Загальна постановка задачі зрозуміла: на вході — масив об'єктів однакової структури (тобто, з однаковими іменами полів), на виході — декілька масивів, кожен з яких збирає значення всіх полів з певним іменем.
...

Постановка задачі була "Чи можна його швидко розбити на окремі масиви, без циклу", а на які саме масиви він же ж не сказав, типу догадуйтесь ).

Якщо дійсно така постановка як ти написав то можна наприклад якось так:

let result = {}

dataArr.forEach(obj => {
  Object.entries(obj).forEach(([k, v]) => {
    Array.isArray(result[k]) ? result[k].push(v) : result[k] = [v]
  })
})

//маємо result як обєкт масивів або якщо треба то масив result = Object.values(result)
Подякували: P.Y.1

17

Re: Як максимально швидко раздербанити масив ?

а якшо на виході маємо масив масивів, а не об'єкт масивів, то ось

const arr = [{
        name: 'FakiNyan',
        title: 'Senior формошльоп developer',
        mainLang: 'JavaScript'
    },
    {
        name: 'mikeos',
        title: 'Користувач',
        mainLang: 'JavaScript'
    }, {
        name: 'P.Y.',
        title: 'Replace Group',
        mainLang: 'python'
    }
];

const results = arr.reduce((acc, currentObject) => {
    Object.values(currentObject).forEach((value, index) => {
        if (acc[index]) acc[index].push(value);
        else acc[index] = [value];
    });
    return acc;
}, []);

результат

[
  [
    "FakiNyan",
    "mikeos",
    "P.Y."
  ],
  [
    "Senior формошльоп developer",
    "Користувач",
    "Replace Group"
  ],
  [
    "JavaScript",
    "JavaScript",
    "python"
  ]
]
версія, де результятом є об'єкт з масивами
const results = arr.reduce((acc, currentObject) => {
 Object.entries(currentObject).forEach(([key, value]) => {
     if (acc[key]) acc[key].push(value);
  else acc[key] = [value];
 });
 return acc;
}, {});

результат

{
    "name": ["FakiNyan", "mikeos", "P.Y."],
    "title": ["Senior формошльоп developer", "Користувач", "Replace Group"],
    "mainLang": ["JavaScript", "JavaScript", "python"]
}
Подякували: P.Y.1

18

Re: Як максимально швидко раздербанити масив ?

Див. вище: Object.keys і Object.values не роблять сортування за ключами, тому, якщо ті ж поля задати в трохи іншому порядку (зберігши при цьому відповідність ключ:значення), вийде каша:

> const arr = [{
...         mainLang: 'JavaScript',
...         name: 'FakiNyan',
...         title: 'Senior формошльоп developer'
...     },
...     {
...         name: 'mikeos',
...         title: 'Користувач',
...         mainLang: 'JavaScript'
...     }, {
...         name: 'P.Y.',
...         mainLang: 'python',
...         title: 'Replace Group'
...     }
... ];
undefined
>
> const results = arr.reduce((acc, currentObject) => {
...     Object.values(currentObject).forEach((value, index) => {
.....         if (acc[index]) acc[index].push(value);
.....         else acc[index] = [value];
.....     });
...     return acc;
... }, []);
undefined
> results
[ [ 'JavaScript', 'mikeos', 'P.Y.' ],
  [ 'FakiNyan', 'Користувач', 'python' ],
  [ 'Senior формошльоп developer', 'JavaScript', 'Replace Group' ] ]
>

Тому краще зробити об'єкт з масивами, а тоді з нього видобути масив масивів за допомогою Object.values — тоді результат матиме сенс.

Подякували: FakiNyan1