Подтвердить что ты не робот

Использование lodash для проверки того, имеет ли массив повторяющиеся значения

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

Я хочу ввести ['foo', 'foo', 'bar'] и вернуть функцию true. И введите ['foo', 'bar', 'baz'] и верните функцию false.

4b9b3361

Ответ 1

Вы можете попробовать этот код:

function hasDuplicates(a) {
  return _.uniq(a).length !== a.length; 
}

var a = [1,2,1,3,4,5];
var b = [1,2,3,4,5,6];

document.write(hasDuplicates(a), ',',hasDuplicates(b));
<script src="http://cdnjs.cloudflare.com/ajax/libs/lodash.js/3.1.0/lodash.min.js"></script>

Ответ 2

Вы можете проверить, что в массиве есть элемент _.some, который не возвращает свое собственное местоположение при поиске в массиве. Другими словами, существует хотя бы один элемент, который имеет совпадение ранее в массиве.

function hasDuplicates(array) {
    return _.some(array, function(elt, index) { 
        return array.indexOf(elt) !== index; 
    });
}

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

Или, в зависимости от стиля кодирования и желания читаемости, и если вы хотите использовать функции стрелок ES6 для краткости:

var earlierMatch  = (elt, index, array) => array.indexOf(elt) !== index;
var hasDuplicates = array => _.some(array, earlierMatch);

Ответ 3

Ну, всегда. lodash _. uniq(). Эта функция фактически возвращает новый массив, который содержит только уникальные значения, поэтому, проверяя, изменила ли длина массива, вы получите свое "истинное" или "ложное" значение, чтобы вернуть себя, я считаю.

Ответ 4

Я не знаю lodash, но я отправляю:

_.any(_.countBy(['foo', 'foo', 'bar']), function(x){ return x > 1; });

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

Ответ 5

Начиная с ES6 вы можете просто использовать Set, так что это становится:

let hasDuplicates = arr => new Set(arr).size != arr.length

console.log(hasDuplicates([5,3,2,1,2,1,2,1]))
console.log(hasDuplicates([1,2,3,4,5]))

Ответ 6

Не нужно использовать lodash, используйте вместо этого следующий код:

function getDuplicates(array, key) {
  return array.filter(e1=>{
    if(array.filter(e2=>{
      return e1[key] === e2[key];
    }).length > 1) {
      return e1;
    }
  })
}