Разрушенный параметр по умолчанию в функции

#javascript #ecmascript-6 #ecmascript-5 #ecmascript-2016

#javascript #ecmascript-6 #ecmascript-5 #ecmascript-2016

Вопрос:

Я пытаюсь использовать функцию, которая работает для двух сценариев, она может либо выполнять итерацию по ключу объекта в массиве, либо по самому значению массива. Так что это печатается нормально:

 const arr1 = [{
  car: 'audi'
},{
  car: 'bmw'
}]

const printCars = arr1.map(({ car }) => console.log(car))
// audi
// bmw
 

Но я не знаю, как использовать параметр по умолчанию той же функции, чтобы обеспечить простой массив

 const arr2 = ['audi', 'bmw'];

const printCars = arr2.map(({ car }) => console.log(car));
// Obviously car is undefined
 

Интересно, как я могу сделать что-то вроде

 const arr = ['audi', 'bmw'];
const printCars = arr.map(({ car } = car) => console.log(car));
// audi
// bmw
 

Ответ №1:

Я не думаю, что есть хороший способ сделать это только в списке параметров. Вы можете разрушить первую строку функции и присвоить значение по умолчанию всему элементу:

 const arr2 = ['audi', 'bmw'];

arr2.forEach((item) => {
  const { car = item } = item;
  console.log(car);
}); 

Обратите внимание, что, поскольку вы не создаете новый массив, а выполняете side-effects ( console.log ) , вы не должны использовать .map — вместо этого используйте forEach . .map используется только тогда, когда вам нужно преобразовать каждый элемент одного массива в новый элемент в другом возвращаемом массиве.

Можно было бы ввести правильное значение в car переменную, используя только список параметров, но это довольно некрасиво и злоупотребление аргументами по умолчанию, я приведу его ниже только в информационных целях (пожалуйста, не используйте его):

 const arr2 = ['audi', 'bmw'];

arr2.forEach((item, i, arr, { car = item } = item) => console.log(car)); 

Вышеуказанное работает, потому forEach что принимает только 3 аргумента, поэтому 4-м будет undefined , поэтому вы можете использовать аргументы по умолчанию, чтобы условно поместить что-то в car идентификатор.

Комментарии:

1. Да, я знаю, я на самом деле использую reduce для реальной функции, это был пример, но вы правы.

2. Спасибо, это отлично работает, я объявлю переменную в теле.