дублирует значения в массиве, используя сокращение, объясняющее - PullRequest
0 голосов
/ 16 января 2019

Может кто-нибудь сказать мне об использовании снижения с распространением

var arr = [10,10, 8000, 8000, 2, 17]
var unique = arr.reduce((x, y) => x.includes(y) ?  x : [...x, y], []);

console.log(unique)

Что x делает в этой области? а spread syntax тоже? и последний пустой массив [ ]

когда я console.log x, он показывает только первый массив значений, а x остальные значения в массивах

Ответы [ 4 ]

0 голосов
/ 16 января 2019

Первый аргумент, передаваемый для сокращения, является функцией обратного вызова.

Имеется два параметра аккумулятора (в данном случае x) и currentValue (в данном случае y)

Reduce будет выполнять итерацию по массиву. При каждом запуске все, что возвращается, является новым значением для аккумулятора, currentValue - это любой элемент, находящийся на текущей итерации, поэтому на первой итерации это будет 10.

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

Для большей ясности я собираюсь немного расширить код

var arr = [10,10, 8000, 8000, 2, 17]

var unique = arr.reduce((x, y) => {
  // does the array x include the value y
  if(x.includes(y){
    // We want an array with no duplicates, so we don't append y to the array, by
    // simply returning x
    return x;
  }

  // if we made it hear it must mean y is unique value so we want to add it to the   
  // array, so we want to return x with y include. We don't want to mutate x, so
  // return a new array with all the elements of x and y at the end
  // we do this using the spread operator(...) it will copy all elements of x into  
  // the new array
  return [...x, y]
}, []);


console.log(unique)
0 голосов
/ 16 января 2019

Возможно, использование разных имен переменных поможет:

var arr = [10,10, 8000, 8000, 2, 17];
var initialiser = [];

var unique = arr.reduce((output, currentElement) => {

  // If our output array includes the current element
  if (output.includes(currentElement)) {

    // Return the output without adding to it
    return output;
  } else {

    // Otherwise create a new array by spreading out
    // the elements of the output array, and adding the
    // current element.
    // `return output.concat(currentElement);` would
    // give the same result
    return [...output, currentElement];
  }

// Pass in the initialiser object which
// we call `output` in each iteration
}, initialiser);
0 голосов
/ 16 января 2019

как это:

Array.prototype.reduce = function(callback, value) {
  let result;

  // initial index
  let initialIndex = 0;

  // initial value
  let initialValue = this[0];

  // If there is a second parameter
  if (typeof value !== undefined) {
    initialIndex = 1;
    initialValue = value;
  }

  // Assignment initial value
  result = initialValue;

  // Traversing
  for (var i = initialIndex; i < this.length; i++) {
    // your callback and x,y here
    result = callback(result, this[i]);
  }

  // Return a new value
  return result;
};

0 голосов
/ 16 января 2019

Для этого вам необходимо понять, как работает функция уменьшения. Ожидается 2 параметра: функция и начальное значение для вашего аккумулятора.

(x, y) => x.includes(y) ?  x : [...x, y]

это функция, которая вызывается внутри функции Reduce. для x передается аккумулятор, для y - текущее значение массива. Таким образом, эта функция принимает значение аккумулятора и текущего значения, проверяет, находится ли значение в аккумуляторе (с помощью include). Если это функция возвращает x, аккумулятор, но если y не в x, функция возвращает новый массив для аккумулятора со всеми элементами старого аккумулятора и новым значением x.

Это далеко не лучший способ удаления дубликатов из массива, потому что каждый цикл вы просматриваете по всему массиву. Если вам нужен массив без дубликатов, рассмотрите возможность использования Sets .

...