Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 20.05.2018, 16:18
Аспирант
Отправить личное сообщение для VyacheslavBozere Посмотреть профиль Найти все сообщения от VyacheslavBozere
 
Регистрация: 18.03.2018
Сообщений: 31

Применение Array.reducce с оператором расширения
Всем привет!Подскажите пож-та : изучаю метод Array.prototype.reduce. На сайте https://developer.mozilla.org/ru/doc...s/Array/Reduce есть предпоследний пример склеивание массивов, содержащихся в объектах массива, с использованием оператора расширения и initialValue Собственно вопрос:
Почему нельзя было обойтись без initial value в этом примере. Попробовал сделать так "return [...prev.books, ...curr.books]" и вылетает ошибка, что prev.books не итерррруется.
// friends - список из объектов(друзей) 
// где поле "books" - список любимых книг друга 
var friends = [ 
{ name: "Anna", books: ["Bible", "Harry Potter"], age: 21 }, 
{ name: "Bob", books: ["War and peace", "Romeo and Juliet"], age: 26 },
{ name: "Alice", books: ["The Lord of the Rings", "The Shining"], age: 18 }
]

// allbooks - список, который будет содержать все книги друзей + 
// дополнительный список указанный в initialValue
var allbooks = friends.reduce(function(prev, curr) {
  return [[I]...prev[/I], ...curr.books];
}, ["Alphabet"]);

// allbooks = ["Alphabet", "Bible", "Harry Potter", "War and peace", 
// "Romeo and Juliet", "The Lord of the Rings", "The Shining"]
Ответить с цитированием
  #2 (permalink)  
Старый 20.05.2018, 16:41
Аспирант
Отправить личное сообщение для VyacheslavBozere Посмотреть профиль Найти все сообщения от VyacheslavBozere
 
Регистрация: 18.03.2018
Сообщений: 31

Понял, спасибо большое!
Ответить с цитированием
  #3 (permalink)  
Старый 20.05.2018, 16:42
Аватар для j0hnik
Профессор
Отправить личное сообщение для j0hnik Посмотреть профиль Найти все сообщения от j0hnik
 
Регистрация: 01.12.2016
Сообщений: 3,650

VyacheslavBozere,
потому что ваш ...prev будет первым объектом, а к ним spread применять нельзя, вот и вылетает ошибка. можете вместо ["Alphabet"] использовать пусто литерал массива
Ответить с цитированием
  #4 (permalink)  
Старый 20.05.2018, 16:42
Аспирант
Отправить личное сообщение для VyacheslavBozere Посмотреть профиль Найти все сообщения от VyacheslavBozere
 
Регистрация: 18.03.2018
Сообщений: 31

Понял, огромное спасибо!
Ответить с цитированием
  #5 (permalink)  
Старый 20.05.2018, 16:43
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,070

VyacheslavBozere,
строка 12 вернула массив у которого нет никаких books и на втором ходе получилась ошибка
Ответить с цитированием
  #6 (permalink)  
Старый 20.05.2018, 16:47
Аватар для j0hnik
Профессор
Отправить личное сообщение для j0hnik Посмотреть профиль Найти все сообщения от j0hnik
 
Регистрация: 01.12.2016
Сообщений: 3,650

var friends = [ 
{ name: "Anna", books: ["Bible", "Harry Potter"], age: 21 }, 
{ name: "Bob", books: ["War and peace", "Romeo and Juliet"], age: 26 },
{ name: "Alice", books: ["The Lord of the Rings", "The Shining"], age: 18 }
]

var allbooks = friends.reduce(function(prev, curr) {
	console.log(prev);
	console.log(...prev); // опа!
  return [...prev, ...curr.books];
});
Ответить с цитированием
  #7 (permalink)  
Старый 20.05.2018, 16:54
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,070

j0hnik,
Ответить с цитированием
  #8 (permalink)  
Старый 20.05.2018, 16:56
Аватар для j0hnik
Профессор
Отправить личное сообщение для j0hnik Посмотреть профиль Найти все сообщения от j0hnik
 
Регистрация: 01.12.2016
Сообщений: 3,650

рони, говорите
Ответить с цитированием
  #9 (permalink)  
Старый 20.05.2018, 17:03
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,070

j0hnik,
код ваш поучительный, советы полезные, но зачем, вопрос был почему "return [...prev.books, ...curr.books]" не работает?
Ответить с цитированием
  #10 (permalink)  
Старый 20.05.2018, 17:11
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,070

VyacheslavBozere,
вариант без initialValue

<script>
// friends - список из объектов(друзей)
// где поле "books" - список любимых книг друга
var friends = [
{ name: "Anna", books: ["Bible", "Harry Potter"], age: 21 },
{ name: "Bob", books: ["War and peace", "Romeo and Juliet"], age: 26 },
{ name: "Alice", books: ["The Lord of the Rings", "The Shining"], age: 18 }
]

// allbooks - список, который будет содержать все книги друзей

var allbooks = friends.reduce(function(prev, curr) {
  return [...(prev.books||prev), ...curr.books];
});

document.write(JSON.stringify(allbooks))

  </script>
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Диалог между HTML и внешним JS в контексте расширения GoogleChrome ev1lart Events/DOM/Window 0 26.04.2017 19:25
Отследить AJAX событие из расширения Chrome zeller Events/DOM/Window 6 25.08.2016 03:32
Встраивание контента из расширения chrome Korchiy Javascript под браузер 3 03.07.2016 13:49
Как с помощью расширения получить "правильную" ссылку? ddos1 Общие вопросы Javascript 11 13.07.2015 15:45
Вызов функции страницы из расширения chrome nontxt Events/DOM/Window 0 09.02.2015 10:42