理解lodash差异通过迭代:不同的数组值大于x

时间:2018-04-24 16:35:54

标签: javascript arrays lodash

我想为lodash differenceBy编写自己的iteratee,它给出了大于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 differenceBy的源代码在这里:https://github.com/lodash/lodash/blob/4.17.5/lodash.js#L6971

你能举个例子来说明如何为这种情况编写一个iteratee。

感谢。

3 个答案:

答案 0 :(得分:1)

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>
&#13;
&#13;
&#13;

但是你会遇到以下问题:

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

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

您可能想做的事情只是链接在一起_.difference.filter

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

答案 1 :(得分:0)

使用此

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]

答案 2 :(得分:0)

通过使用带比较的函数,可以创建两个具有布尔值的数组。

这个

_.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