Size: a a a

2021 April 28

VK

Vyacheslav Koval in JS Liberty
let array = [3, 0, 0, 1, 2, 0, 5, 4, 3, 3];
const noZerosArray = array.filter(item => item);
const zerosArray = noZerosArray.concat(Array(array.length - noZerosArray.length).fill(0))
источник

VK

Vyacheslav Koval in JS Liberty
function Zeros(arr) {
 let newArr = [];

 for (let i = array.length - 1; i >= 0; --i) {
   if (arr[i] != 0){
     newArr.unshift(arr[i]);
   } else {
     newArr.push(arr[i]);
   }
 }

 return newArr;
}
источник

VK

Vyacheslav Koval in JS Liberty
Проходим массив с конца, и если значения не нулевые - записываем в начало, а нулевые в конец
источник

NR

Nikolai Reguliarniy in JS Liberty
ты шо, гонишь?)
источник

p

persona x grata in JS Liberty
юзать unshift не очень практика на большие данные (если будет так), каждый раз будет пересчитываться индексы всего массива
источник

VK

Vyacheslav Koval in JS Liberty
в современных реализациях интерпретаторов для массивов резервируется определенное количество места вначале и в конце, поэтому должно быть эффективно
источник

p

persona x grata in JS Liberty
как это спасает от пересчета всех индексов массива, когда ты добавляешь элемент в начало?
источник

VK

Vyacheslav Koval in JS Liberty
А при чем тут индексы? Я же новый массив создаю. Про JS точно не могу сказать, а в Perl при добавлении элемента в начало просто смещается указатель на начало массива (во внутренней структуре в C)
источник

NR

Nikolai Reguliarniy in JS Liberty
большие это сколько?
источник

VK

Vyacheslav Koval in JS Liberty
Вот, кстати, подтверждение - [V8 Deep Dives] Understanding Array Internals

Here we see that the internal array used as the backing store has changed to <FixedArray[17]> [PACKED_SMI_ELEMENTS]. The new array has the same elements kind, but a different address, and the internal array size equal to 17. On our 64-bit system, this means that it takes 17 * 8=136 bytes of memory (for the sake of simplicity, we ignore object headers). It also means that the allocated internal array is bigger than what we requested. This allows V8 to achieve constant amortized time for push() and similar operations that grow the array. The following formula is used to determine the new size in situations when the internal array is not enough:

new_capacity = (old_capacity + 50%) + 16
источник

NR

Nikolai Reguliarniy in JS Liberty
хотя перечитал условия, если задом наперед то так ванлайнер
источник

DE

Denis Efremov in JS Liberty
Нашел неплохую статейку для разрыва мозгов https://bisqwit.iki.fi/story/howto/bitmath/
источник

VK

Vyacheslav Koval in JS Liberty
Упростил код:
> [3, 0, 0, 1, 2, 0, 5, 4, 3, 3].sort((a, b) => a && b || (b - a))
[
 3, 1, 2, 5, 4,
 3, 3, 0, 0, 0
]
источник

В

Виктория in JS Liberty
В js вообще нет массивов, по крайней мере таких как в Си
источник

NR

Nikolai Reguliarniy in JS Liberty
это не будет работать с отрицательными числами как минимум
источник

VK

Vyacheslav Koval in JS Liberty
в данном случае я имел ввиду, что внутри JS (например, в V8 engine) это некая структура (struct) на C, которая оперирует размером массива, выделение памяти и т.д.
источник

T

Th0r in JS Liberty
typedarray же
источник

p

persona x grata in JS Liberty
Push быстрее, потому что говорю же индексы пересчитываются

function withUnshift(arr) {
 let newArr = [];

 for (let i = array.length - 1; i >= 0; --i) {
   newArr.unshift(arr[i])
 }

 return newArr;
}

function withPush(arr) {
 let newArr = [];

 for (let i = array.length - 1; i >= 0; --i) {
   newArr.push(arr[i])
 }

 return newArr;
}

const array = Array.from(Array(1000000).keys())

let beforeUnshift = performance.now()
withUnshift(array)
let afterUnshift = performance.now()

let beforePush = performance.now()
withPush(array)
let afterPush = performance.now()

console.log('Milliseconds with unshift:', afterUnshift - beforeUnshift, 'Milliseconds with push:', afterPush - beforePush)
console.log('Milliseconds with push:', afterPush - beforePush)
источник

p

persona x grata in JS Liberty
Milliseconds with unshift: 447 Milliseconds with push: 28
источник

В

Виктория in JS Liberty
источник