2017-01-04 7 views
1

Мне было интересно, может ли кто-нибудь показать мне, что я делаю неправильно здесь, я пытаюсь использовать _.reduce, чтобы получить поля в объекте и, кажется, каждый раз пропускает «первый».Lodash _.reduce issue?

Первая строка здесь - простой старый js, следующий - lodash.

$scope.actualKeys = Object.keys($scope.item); 
_.reduce($scope.item, function(result, value, key) { 
    $scope.keys.push(key); 
}); 

Где $ scope.item является

$scope.item = { 
field1: 'test', 
field2: 'test', 
field3: 'test', 
field4: 'test', 
field5: 'test', 
field6: 'test' 
}; 

https://plnkr.co/edit/J9MBahQNIsZkMFzrHjKG

ответ

0

Использование _.forEach() вместо _.reduce() (plunk):

_.forEach($scope.item, function(value, key) { 
    $scope.keys.push(key); 
}); 
1

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

Примечание: я не знаю lodash; это просто стандартное снижение поведения. Посмотрите документацию, чтобы узнать, как установить начальный аккумулятор.

Установка начального аккумулятора обычно является хорошей идеей, если вы точно не знаете, что список никогда не будет пустым. Не устанавливая его, попытка уменьшить пустой список либо бросит, либо вернет undefined (в зависимости от поведения lodash). Без учета этих сбоев вы можете получить сюрприз по дороге.

0

Если вы добавите аккумулятор, он будет работать.

$scope.actualKeys = Object.keys($scope.item); 
_.reduce($scope.item, function(result, value, key) { 
    $scope.keys.push(key); 
}, 0); 
0

Функция уменьшения используется для уменьшения коллекции до одного значения. Каждый раз через это происходит накопление на основе предыдущего значения, следовательно, ваша проблема с первым. Другими словами, хотя вы можете заставить его работать (как показали другие), это неправильный инструмент для работы.

Что вам нужно в этом случае - это простой цикл (или, как вы уже знаете, Object.keys).

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

  • Нет связанных вопросов^_^