@blinded-in-chains

blinded-in-chains

blinded-in-chains

Дата рождения: 01.01.1900

Blinded in chains of methods.

6 я читаю 2 меня читают
2 постов
14 комментариев
blinded-in-chains
03 Jun 2016

Вот почему:
array.reduce(function(a, b){
return a.cost + b.cost;
})
возвращает int при array.length > 1, но всегда a при array.length == 1? И да, я знаю, что должен вернуть объект того же типа, что и a и b, но в первом случае все работает. Что за неконсистентность?

Рекомендовано: Tenno-Seremel
#ootwcc 28
Вы можете выбрать до 10 файлов общим размером не более 10 МБ.
03 Jun 2016
array.reduce(function(a, b) { return a.cost + b.cost }, {cost: 0});

:}

#ootwcc/1
Вы можете выбрать до 10 файлов общим размером не более 10 МБ.
03 Jun 2016

Хотя нет. Там же начальное значение.

#ootwcc/2 в ответ на /1
Вы можете выбрать до 10 файлов общим размером не более 10 МБ.
03 Jun 2016

Так, а почему просто 0 при одном элементе не работает? Эээ… %)

#ootwcc/3 в ответ на /2
Вы можете выбрать до 10 файлов общим размером не более 10 МБ.
03 Jun 2016

Tenno-Seremel, хорошая попытка.

#ootwcc/4 в ответ на /2
Вы можете выбрать до 10 файлов общим размером не более 10 МБ.
03 Jun 2016

Хрень какая-то.

#ootwcc/5 в ответ на /4
Вы можете выбрать до 10 файлов общим размером не более 10 МБ.
03 Jun 2016

Tenno-Seremel, в принципе для моего кейса работает, потом что начальное значение — 0. Спасибо.

#ootwcc/6 в ответ на /1
Вы можете выбрать до 10 файлов общим размером не более 10 МБ.
03 Jun 2016

Не, а ты попробуй на массиве с больше 1 элемента. У меня не сработало почему-то (разве что опечатка где-то).

#ootwcc/7 в ответ на /6
Вы можете выбрать до 10 файлов общим размером не более 10 МБ.
03 Jun 2016

Tenno-Seremel, твою ж мать!

#ootwcc/8 в ответ на /7
Вы можете выбрать до 10 файлов общим размером не более 10 МБ.
03 Jun 2016

Магия :)

#ootwcc/9 в ответ на /8
Вы можете выбрать до 10 файлов общим размером не более 10 МБ.
03 Jun 2016

Tenno-Seremel, я, собственно, об этом и писал.

#ootwcc/11 в ответ на /9
Вы можете выбрать до 10 файлов общим размером не более 10 МБ.
03 Jun 2016

JS специалисты есть? Есть чо?

#ootwcc/10
Вы можете выбрать до 10 файлов общим размером не более 10 МБ.
03 Jun 2016

Tenno-Seremel,

Если массив пустой и аргумент initialValue не указан, будет брошено исключение TypeError. Если массив состоит только из одного элемента (независимо от его положения в массиве) и аргумент initialValue не указан, или если аргумент initialValue указан, но массив пустой, то будет возвращено одно это значение, без вызова функции callback.

https://developer.mozilla.o...Objects/Array/Reduce

#ootwcc/12 в ответ на /10
Вы можете выбрать до 10 файлов общим размером не более 10 МБ.
03 Jun 2016

Капитан :) Мы «ищем варианты».

#ootwcc/13 в ответ на /12
Вы можете выбрать до 10 файлов общим размером не более 10 МБ.
03 Jun 2016

Tenno-Seremel, я тогда не понял в чем проблема. Если вам нужно избежать вываливания элемента массива в результат - указывайте явно начальное значение 0, тогда callback вызовется если массив не пустой (или хотя бы вернет int если пустой)

#ootwcc/15 в ответ на /13
Вы можете выбрать до 10 файлов общим размером не более 10 МБ.
03 Jun 2016

Так и сделали. Не работает :} Ну или в бравзере JS совсем никакой. Т.е. когда я передаю {cost: 0} в дефолт, то при > 1 элементе получается фига.

#ootwcc/16 в ответ на /15
Вы можете выбрать до 10 файлов общим размером не более 10 МБ.
03 Jun 2016

Tenno-Seremel, наверно поэтому
[{cost:1},{cost:2}].reduce(function(a, b) { return {cost: a.cost + b.cost} }, {cost:0})

Object { cost=3}

#ootwcc/17 в ответ на /16
Вы можете выбрать до 10 файлов общим размером не более 10 МБ.
03 Jun 2016

только я щас подумал, и понял, что так некруто писать - ты на каждой итерации создаёшь и тут же выкидываешь объект.

#ootwcc/18 в ответ на /17
Вы можете выбрать до 10 файлов общим размером не более 10 МБ.
03 Jun 2016

igelko, ну это да, твой вариант с a += b.cost круче в этом плане

#ootwcc/20 в ответ на /18
Вы можете выбрать до 10 файлов общим размером не более 10 МБ.
03 Jun 2016

или с обязательной инициализацией аккумулятора и его изменением.

#ootwcc/22 в ответ на /20
Вы можете выбрать до 10 файлов общим размером не более 10 МБ.
03 Jun 2016

igelko, это да. Но я хотел продемонстрировать то, что аккумулятор должен возвращать такой же объект, какой может принять в a

#ootwcc/23 в ответ на /22
Вы можете выбрать до 10 файлов общим размером не более 10 МБ.
03 Jun 2016

вот этот вариант тоже не должен делать лишних выделений памяти.

#ootwcc/24 в ответ на /23
Вы можете выбрать до 10 файлов общим размером не более 10 МБ.
03 Jun 2016

igelko, да поняли мы уже про память. Демонстративная функция же у примера, ну. И я вообще не JSер так что могу высирать говно любой степени кривости :p (на самом деле нет конечно)

#ootwcc/27 в ответ на /24
Вы можете выбрать до 10 файлов общим размером не более 10 МБ.
03 Jun 2016

то есть не аккумулятор а коллбек конечно же

#ootwcc/25 в ответ на /23
Вы можете выбрать до 10 файлов общим размером не более 10 МБ.
03 Jun 2016

я их обычно лямбдочками зову.

#ootwcc/26 в ответ на /25
Вы можете выбрать до 10 файлов общим размером не более 10 МБ.
03 Jun 2016

Слоупочность решена :)

#ootwcc/28 в ответ на /23
Вы можете выбрать до 10 файлов общим размером не более 10 МБ.
03 Jun 2016

(~__~)'

#ootwcc/19 в ответ на /17
Вы можете выбрать до 10 файлов общим размером не более 10 МБ.
03 Jun 2016

ну кагбэ всё по спеке.
у reduce первым аргументом идёт аккумулятор или первый элемент.
и аккумулятор ты возвращаешь.
Если у тебя массив из одного элемента и не дан аккумулятор, то тупо возвращается 1й элемент.

> [{cost: 1}].reduce((a, b) => {return a.cost + b.cost})
{ cost: 1 }
> [{cost: 1}, {cost:2}].reduce((a, b) => {return a.cost + b.cost})
3
> [{cost: 1}, {cost:2}, {cost:3}].reduce((a, b) => {return a.cost + b.cost})
NaN

Правильно так или так или вообще сяк:

> [{cost: 1}, {cost:2}, {cost:3}].reduce((a, b) => {return { cost: a.cost + b.cost }})
{ cost: 6 }
> [{cost: 1}, {cost:2}, {cost:3}].reduce((a, b) => { a.cost +=b.cost ; return a }, {cost:0})
{ cost: 6 }
> [{cost: 1}, {cost:2}, {cost:3}].reduce((a, b) => { a +=b.cost ; return a }, 0)
6
Комментарий был отредактирован в 16:37:47 03.06.2016
#ootwcc/14
Вы можете выбрать до 10 файлов общим размером не более 10 МБ.
03 Jun 2016

igelko, я тебя люблю! Нужен был вот этот вариант:
[{cost: 1}, {cost:2}, {cost:3}].reduce((a, b) => { a +=b.cost ; return a }, 0)
Вариант 2, кстати, тоже норм: возвращает объект одного типа независимо от количества элементво в начальном массиве.

#ootwcc/21 в ответ на /14
Вы можете выбрать до 10 файлов общим размером не более 10 МБ.

Добавить пост

Вы можете выбрать до 10 файлов общим размером не более 10 МБ.
Для форматирования текста используется Markdown.