умножить каждый элемент в массиве на 2, используя цикл for - PullRequest
0 голосов
/ 10 февраля 2019

Я пытаюсь удвоить каждый элемент в массиве

let arr =  ['onions', 'tomatoes', 'etc'...';

с помощью цикла for и продолжаю получать ошибку NaN ... Я все еще учусь, поэтому любые советы будут оценены.

Я пробовал цикл, .map() и другие методы, но просто не вижу очевидной проблемы ...

let newIngr = tortSoup.filter(function(value, index, arr) {
  if (value !== 'onion' && value !== 'red pepper') {
    return value;
    console.log(newIngr);
  });       
}

let myReci = [];

for(var i = 0; i < newIngr.length; i++) {
  myReci[i] = newIngr[i] * 2;
}

console.log(myReci);

Ожидается: каждый элемент массива умножается на два ивозвращается:

['onions', tomatoes', 'garlic', 'fontina']

станет:

['onions', 'onions', 'tomoatoes', 'tomatoes', garlic, 'garlic', 'fontina', 'fontina']

Ответы [ 5 ]

0 голосов
/ 10 февраля 2019

Использование Array.flatMap() (не поддерживается IE / Edge):

const array = ['onions', 'tomatoes', 'garlic', 'fontina'];

const result = array.flatMap(item => [item, item]);

console.log(result)
0 голосов
/ 10 февраля 2019

Ну, проблема в том, что

string * 2 не вернет вам 2 строки.вернется NaN

console.log('test'* 2) //NaN

То, чего вы пытаетесь достичь, можно сделать методом repeat.

console.log('test '.repeat(2))

Ваш ожидаемый результат может быть достигнут следующим образом

let arr = ['onions', 'tomatoes', 'garlic', 'fontina']
let output = arr.reduce((op,inp)=>(op.concat([inp,inp])),[])
console.log(output)
0 голосов
/ 10 февраля 2019

Вот способ сделать это с Array.reduce() и оператором спреда:

const array = ['onions', 'tomatoes', 'garlic', 'fontina'];

const result = array.reduce((acc, x) => ([...acc, x, x]), []);

console.log(result)

Array.reduce выполняет итерацию по вашему входному массиву и вызывает обратный вызов для каждого элемента.Этот обратный вызов имеет два аргумента: первый - это результат последней итерации, а второй - текущий элемент массива.

Здесь обратный вызов возвращает новый массив, состоящий из предыдущего результата обратного вызова (распространениев новый массив с оператором распространения ...) и текущий элемент повторяется дважды.

Чтобы запустить процесс сокращения, нам также нужно начальное значение, здесь мы даем пустой массив (последний аргумент для reduce).

Вот подробное описание значений acc и x в обратном вызове для следующего сокращения:

['a', 'b', 'c'].reduce((acc, x) => ([...acc, x, x]), []);
  1. acc = [], x = 'a' => returns ['a', 'a']
  2. acc = ['a', 'a'], x = 'b' => returns ['a', 'a', 'b', 'b']
  3. acc = ['a', 'a', 'b', 'b'], x = 'c' => returns ['a', 'a', 'b', 'b', 'c', 'c']
0 голосов
/ 10 февраля 2019

Использование ванильного JavaScript:

const ingredients = [ 'onions', 'tomatoes', 'garlic', 'fontina' ]
const ingredientsToRemove = [ 'onions', 'red pepper' ]

// Using Array.reduce method
const doubleIngredients = ingredients.reduce(
  ( array, ingredient ) =>
  {
    // If the ingredient has to be removed, return the array
    // Else return the array with two times the current ingredient
    return ingredientsToRemove.includes( ingredient ) ?
      array
      :
      [ ...array, ingredient, ingredient ]      
  },
  []
)

console.log({ ingredients, doubleIngredients })
0 голосов
/ 10 февраля 2019
  • Итерация по массиву input с использованием .map().
  • Инициализация нового массива с использованием конструктора Array() и его заполнение с использованием метода .fill() массивов.
  • Наконец, выможно преобразовать массив массивов в один массив, используя .concat() и оператор распространения.

const input = ['onions', 'tomatoes', 'garlic', 'fontina'];

const dupeValues = (arr, factor) => [].concat(...arr.map(s => new Array(factor).fill(s)));

console.log(dupeValues(input, 2));
console.log(dupeValues(input, 3));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...