2016-04-20 3 views
2

Ошибка

Я работал над упражнением, которое должно суммировать сумму изменений, оставленную в кассовом аппарате, переменную cid.Как я могу использовать метод уменьшения Javascript для массивов массивов?

cid выглядит примерно так:

var cid = [["PENNY", 0], ["NICKEL", 0], ["DIME", 0], ["QUARTER", 0], ["ONE", 0], ["FIVE", 0], ["TEN", 0], ["TWENTY", 0], ["ONE HUNDRED", 0]]; 

В таком случае, как это, когда все значений являются 0, то я должен сообщить, что регистр пуст.

Я думал, что-то, как это должно работать:

if (cid.reduce(function(prevVal, curVal) { 
    return prevVal[1] + curVal[1]; 
}) === 0) 

Но это не так.


Рытье В

Некоторые странные вещи, кажется, случаются при работе с массивами в рамках массивов и метод reduce. Например:

cid.reduce(function(prevVal, curVal) { 
    return prevVal[1] + curVal[1]; 
}); 

NaN 

В то время как, если я просто пусть весь массив через, я получаю что-то, хоть что-то странное:

cid.reduce(function(prevVal, curVal) { 
    return prevVal + curVal; 
}); 

"PENNY,0NICKEL,0DIME,0QUARTER,0ONE,0FIVE,0TEN,0TWENTY,0ONE HUNDRED,0" 

Это для меня ясно, что при использовании reduce, это - это не просто углубление на один уровень глубже в массив/объект, как я и предполагал.

Тем не менее, единственное, что я мог заподозрить, также ошибочно: он не вникает во все уровни. Если бы это было так, я бы ожидал, что видел что-то вроде этого (уведомления нет никаких запятых):

"PENNY0NICKEL0DIME0QUARTER0ONE0FIVE0TEN0TWENTY0ONE HUNDRED0" 

Два вопроса

  1. Есть ли способ, чтобы эффективно использовать reduce метод с многомерными массивами вроде этого?
  2. Может ли кто-нибудь помочь мне понять, что происходит под капотом здесь?
+0

'array + array === array.toString() + array.toString()' – elclanrs

+0

Два ответа ниже пригвоздили его - просто хотели указать, что вы действительно возвращаете количество монет/нот, которые у вас есть, а не их ценность. – James

+0

Предполагается, что это «[[[« PENNY », 0],« NICKEL », 0], [« DIME », 0], [« QUARTER », 0], [« ONE », 0], [ «FIVE», 0], [«TEN», 0], [«TWENTY», 0], [«ONE HUNDRED», 0]] 'или' [["PENNY", 0], ["NICKEL", 0 ], ["DIME", 0], ["QUARTER", 0], ["ONE", 0], ["FIVE", 0], ["TEN", 0], ["TWENTY", 0] ["ONE HUNDRED", 0]] ' – jdphenix

ответ

4

Вы немного непонимания природы reduce; значение в prevVal не является тем значением, которое мы называли последним; это какое-то значение мы последний. Поскольку вы возвращаете целое число, prevVal является целым числом, а prevVal[1] - undefined.

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

var cid = [ 
 
    ["PENNY", 0], 
 
    ["NICKEL", 0], 
 
    ["DIME", 0], 
 
    ["QUARTER", 0], 
 
    ["ONE", 0], 
 
    ["FIVE", 0], 
 
    ["TEN", 0], 
 
    ["TWENTY", 0], 
 
    ["ONE HUNDRED", 0] 
 
] 
 

 
var val = cid.reduce(function(prevVal, curVal) { 
 
    return prevVal + curVal[1]; 
 
}, 0); 
 

 
document.write("<pre>" + JSON.stringify(val) + '</pre>');

+1

Да, спасибо! Я неправильно понял этот тонкий аспект того, что 'prevVal' действительно представляет в' reduce'. То, как вы объяснили это, здорово, и что реализация 'reduce' имеет большой смысл. –

2

Следующие должны работать

cid.reduce((memo, item) => memo + item[1], 0) 

или

cid.reduce(function(memo, item) { return memo + item[1] }, 0) 
1

Никто не объяснил вам, что происходит «под капотом», поэтому я буду принимать удар на него.

Так что это в основном то, что происходит:

cid.reduce(function(prevVal, curVal) { 
    return prevVal[1] + curVal[1]; 
}); 

NaN 

В этом случае вы захватывая два массива, которые Javascript пытается принуждать и это приводит к NaN

Здесь:

cid.reduce(function(prevVal, curVal) { 
    return prevVal + curVal; 
}); 

Он уменьшает каждый элемент в каждом массиве, но оператор return пытается уменьшить строку и число. В js 0 + "string" используется 0string, потому что js принуждает число к строке и затем объединяет их.

+0

Спасибо, но я все еще смущен. Ближе к концу вы говорите '0 +" строку "' is '0string', что я и думал, но это не ** то, что я видел. Вместо этого он каким-то образом принуждал и создавал ** запятую **. Это была та часть, которая меня действительно смутила. Кроме того, я думаю, что я собираю два массива в обеих попытках, просто первая попытка я попытаюсь свести к одному значению. Объяснение @Hamms все еще имеет для меня наибольший смысл: 'prevVal' становится просто целым числом, так как это ** return **, тогда как' curVal' по-прежнему является массивом, который должен быть подмножеством. –

Смежные вопросы