LINUX.ORG.RU

Как сделать 1 строкой массив массивов

 ,


0

3

Как можно упростить код?


const sids = [];
const sidsRemote = [[1,2,3], [1,2,3], [1,2,4]]
const sidsLocal = [1,2,3]

sidsRemote.forEach((serv)=>{
    serv.forEach(sid=>{
        sids.push(sid)
    })

})

sidsLocal.forEach((sid)=>{
    sids.push(sid)
})

//result sids = [1,2,3,1,2,3,1,2,3,1,2,3]

★★★★
Ответ на: комментарий от vbr

Но вообще это всё говнокод для выпендрёжа, конечно. Если бы я писал этот код, как-то так бы написал:


const sidsRemote = [[1,2,3], [1,2,3], [1,2,4]];
const sidsLocal = [1,2,3];

let sidsLength = 0;
for (const serv of sidsRemote) {
    sidsLength += serv.length;
}
sidsLength += sidsLocal.length;

const sids = new Array(sidsLength);
let sidsIndex = 0;
for (const serv of sidsRemote) {
    for (const sid of serv) {
        sids[sidsIndex++] = sid;
    }
}
for (const sid of sidsLocal) {
    sids[sidsIndex++] = sid;
}

console.log(sids);
vbr ★★★★★
()
Ответ на: комментарий от goingUp

На самом деле нет. Например ты знаешь, какой максимальный размер массива sidRemotes в данном случае будет работать нормально? Какая временная сложность этого алгоритма? Сколько аллокаций памяти будет происходить? Ничего не понятно. Ещё и на разных браузерах по-разному. А код на пол экрана простой и понятный, никаких вопросов не вызывает и просто работает. Чем меньше строк, тем хуже.

vbr ★★★★★
()
Ответ на: комментарий от vbr

Понятнее в том плане, что ты читаешь одну строчку и понимаешь, что мы тут объединяем все массивы. А в том случае, нужно прочитать всю простыню, и еще проверить, нет ли косяка, если ищешь баг. Да еще и приписка нужна, что типа сделал это, потому что не доверяешь стандартной функции. А то не поймут) Хотя все равно наверное не поймут)

Например ты знаешь, какой максимальный размер массива sidRemotes в данном случае будет работать нормально? Какая временная сложность этого алгоритма? Сколько аллокаций памяти будет происходить? Ничего не понятно. Ещё и на разных браузерах по-разному.

Ты думаешь, что сделал реализацию лучше стандартной? Вот без тестов не поверю) Или типа что так предсказуемей? Ну, такое, вот никогда не было косяков со встроеным concat() )

goingUp ★★★★★
()
Ответ на: комментарий от vbr

это всё говнокод для выпендрёжа

А мне кажется, портянка вида «кишки наружу» гораздо более похожа на говнокод для выпендрёжа, чем лаконичный однострочник %)

Nervous ★★★★★
()
Ответ на: комментарий от animechaos

Я могу оправдать подобный подход, когда нужно хотя бы сотни тысяч элементов в конкретной задаче обработать и это происходит регулярно, чтобы не раздувать память лишними копиями

Но уж точно не творить этот цирк повсюду

animechaos ★★
()

Вы хотите нескучных однострочников — их есть у меня.

const sidsRemote = [
    [1, 2, 3],
    [1, 2, 3],
    [1, 2, 4],
];
const sidsLocal = [1, 2, 3];

const sids = sidsRemote.reduce((acc, val) => (acc.push(...val), acc), sidsLocal);

console.log('sids: %o', sids);
sids: [1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 4]

Порядок малость перепутался, ну да это ерунда. Наверное.

Nervous ★★★★★
()
Последнее исправление: Nervous (всего исправлений: 1)
Ответ на: комментарий от animechaos

работал с таким кодом. Врагу не пожелаю

Если его вовремя спрятать внутри хорошо документированной и покрытой тестами функции — то оно вроде как бы и ничаво. Жить можно.

Но если уже есть хорошо документированная функция, которая позволяет сделать то же самое за один вызов — то непонятно, зачем так жить %)

Nervous ★★★★★
()
Последнее исправление: Nervous (всего исправлений: 2)
Ответ на: комментарий от goingUp

Ты думаешь, что сделал реализацию лучше стандартной?

Я не думаю, я знаю, что число аргументов в жаваскрипт функцию ограничено довольно небольшим числом. Вроде 50к в сафари или около того.

vbr ★★★★★
()