Понимать lodash diffBy iteratee: различные значения массива больше чем x - PullRequest
0 голосов
/ 24 апреля 2018

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

Согласно документации.Итератор используется для «генерации критерия, по которому они сравниваются».

Пример в соответствии с документацией:

_.differenceBy([1, 2, 3, 5, 6], [1, 2, 3, 8, 10], Math.floor); // [5, 6]

Это будет похоже на использование Math.floor ()

let iter_floor = (value) => {
    return Math.floor(value);
};

let differenceBy = _.differenceBy([1, 2, 3, 5, 6], [1, 2, 3, 8, 10], iter_floor);
console.log(differenceBy); // [5, 6]

Но когда я пытаюсь это

let iter_greater = (value) => {
    return value > 5;
};

let differenceBy = _.differenceBy([1, 2, 3, 5, 6], [1, 2, 3, 8, 10], iter_greater);
console.log(differenceBy); // []

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

Исходный код lodash diffBy здесь: https://github.com/lodash/lodash/blob/4.17.5/lodash.js#L6971

Не могли бы вы дать мне пример того, как написать итератор для этого случая.

Спасибо.

Ответы [ 3 ]

0 голосов
/ 24 апреля 2018

differenceBy будет запускать каждое значение через эту функцию, а затем, если возвращаемое значение является уникальным, сохранит его. Ваш iter_greater возвращает только true или false, ни один из которых не встречается только один раз, поэтому он (как и должно быть) возвращает пустой массив.

Вы можете сделать это так, что в большинстве случаев будет работать:

let iter_greater = (value) => {
    return value > 5 ? value : undefined;
};

let differenceBy = _.differenceBy([1, 2, 3, 5, 6], [1, 2, 3, 8, 10], iter_greater);
console.log(differenceBy); // []
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.5/lodash.min.js"></script>

Но у вас будут проблемы с:

let iter_greater = (value) => {
    return value > 5 ? value : undefined;
};

let differenceBy = _.differenceBy([1, 2, 3, 5, 6], [], iter_greater);
console.log(differenceBy); // []
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.5/lodash.min.js"></script>

То, что вы, вероятно, хотите сделать, это просто соединить вместе _.difference и .filter:

let differenceBy = _.difference([1, 2, 3, 5, 6], [1, 2, 3, 8, 10]).filter(x => x > 5);
console.log(differenceBy); // []
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.5/lodash.min.js"></script>
0 голосов
/ 25 апреля 2018

Используя функцию сравнения, вы создаете два массива с логическими значениями.

Это

_.differenceBy([1, 2, 3, 5, 6], [1, 2, 3, 8, 10], iter_greater);

работает в два этапа:

  1. Отобразить все значения и взять функцию iteratee iter_greater

    [1,  2,  3,  5,  6]  ->  [false, false, false, false,  true]
    [1,  2,  3,  8, 10]  ->  [false, false, false,  true,  true]
    
  2. Отфильтруйте сопоставленный первый массив, проверив, существует ли значение во втором массиве.

    [false, false, false, false,  true]  first array
    [false, false, false,  true,  true]  second array
     false                               exists in 2nd array
            false                        exists in 2nd array
                   false                 exists in 2nd array
                          false          exists in 2nd array
                                  true   exists in 2nd array
    
    [                                 ] // no values, 2nd array contains true and false
    
0 голосов
/ 24 апреля 2018

Используйте это

let iter_floor = (value) => {
 return value > 5 && Math.floor(value);
};

let differenceBy = _.differenceBy([1, 2, 3, 5, 6,7,8,9], [1, 2, 3, 8, 10], iter_floor);
console.log(differenceBy); // [6, 7, 9]
...