我想为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。
感谢。
答案 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;
但是你会遇到以下问题:
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;
您可能想做的事情只是链接在一起_.difference
和.filter
:
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;
答案 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);
分两步进行:
映射所有值并使用iteratee函数iter_greater
[1, 2, 3, 5, 6] -> [false, false, false, false, true] [1, 2, 3, 8, 10] -> [false, false, false, true, true]
通过检查第二个数组中是否存在该值来过滤映射的第一个数组。
[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