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

var numbers = [1, 1, 2, 3, 4, 4];
// function should return [1, 2, 3, 4]

function unique(array) {
  array.reduce((uniqueArray, number) => {
    if (uniqueArray.indexOf(find(array.number))) {
      uniqueArray.push(array.number);
    }
    return uniqueArray;
  }, []);
}
console.log(unique(numbers));
// undefined 
// undefined

При запуске этого кода я получаю

не определено

Дважды в консоли браузера Javascript.

2
StandardNerd 9 Янв 2017 в 17:37

4 ответа

Лучший ответ

Вам нужно вернуть заявление.

return array.reduce((uniqueArray // ...
// ^^^

А некоторые лучше найти метод с помощью {{X0} }

function unique(array) {
    return array.reduce((uniqueArray, number) => {
        if (uniqueArray.indexOf(number) === -1) {
            uniqueArray.push(number);
        }
        return uniqueArray;
    }, []);
}

var numbers = [1, 1, 2, 3, 4, 4];
console.log(unique(numbers));

А теперь с Set и синтаксис распространения ... для сбора элементов в новом массиве.

function unique(array) {
    return [... new Set(array)];
}

var numbers = [1, 1, 2, 3, 4, 4];
console.log(unique(numbers));
2
Nina Scholz 9 Янв 2017 в 15:09

У вас есть несколько ошибок. Сначала вам нужно вернуть значение из вашей функции, а также проверить, есть ли элемент в uniqueArray, вы можете использовать indexOf() == -1.

var numbers = [1, 1, 2, 3, 4, 4];

function unique(array) {
  return array.reduce((uniqueArray, number) => {
    if (uniqueArray.indexOf(number) == -1) uniqueArray.push(number)
    return uniqueArray;
  }, []);
}
console.log(unique(numbers));

В ES6 / 7 вы можете использовать функции includes() и стрелки, как это.

var numbers = [1, 1, 2, 3, 4, 4];

function unique(arr) {
  return arr.reduce((r, n) => (!r.includes(n) ? r.push(n) : 1) && r , []);
}
console.log(unique(numbers));
2
Nenad Vracar 9 Янв 2017 в 14:56

Причины ошибок объясняются в предыдущих ответах. Поэтому я просто добавил альтернативный метод с помощью {{X0} } метод.

var numbers = [1, 1, 2, 3, 4, 4];
// function should return [1, 2, 3, 4]

function unique(array) {
  return array.filter(function(v, i, arr) {
    // compare index with first element index
    return i == arr.indexOf(v);
  })
}
console.log(unique(numbers));

С функцией стрелки ES6.

var numbers = [1, 1, 2, 3, 4, 4];
// function should return [1, 2, 3, 4]

function unique(array) {
  return array.filter((v, i, arr) => i == arr.indexOf(v))
}
console.log(unique(numbers));

ОБНОВЛЕНИЕ: со ссылочным объектом вместо проверки индекса.

var numbers = [1, 1, 2, 3, 4, 4],
  ref = {};


function unique(array) {
  return array.filter(function(v) {
    if (!(v in ref)) {
      ref[v] = true;
      return true;
    }
    return false;
  })
}
console.log(unique(numbers));
3
Pranav C Balan 10 Янв 2017 в 04:39

Вы всегда можете использовать Array.includes.

function SillyFunctionName(array) {
    "use strict";

    var uniqueArray = [];

    for (var i = 0; i < array.length; i++) {
        if (uniqueArray.includes(array[i])) {
            break;
        } else {
            uniqueArray.push(array[i]);
        }
    }

    return uniqueArray;
}
0
Crowes 9 Янв 2017 в 14:51