我有一个对象数组,并且想要:
我事先不知道这些物体在哪里。为了识别它们,我需要使用一个函数来查询它们的属性。在第二个数组中检索已删除的对象是有意义的。
我曾希望找到像filter
或splice
这样的本机方法来做这件事。以下是我提出的解决方案:
if (!Array.prototype.cherrypick) {
Array.prototype.cherrypick = function(fn) {
let basket = []
let ii = this.length
let item
for ( ; ii-- ; ) {
item = this[ii]
if (fn(item)) {
basket.unshift(item)
this.splice(ii, 1)
}
}
return basket
}
}
我错过了什么吗?有没有一个本机方法已经可以做到这一点?我的解决方案在某些方面是不可靠的吗?
发布于 2018-09-28 23:54:56
像Array.filter()
这样的方法返回一个新的数组,而不是改变原来的数组。
您可以使用Array.reduce()
创建一个分区方法,该方法将返回两个数组-通过谓词的数组和失败的数组:
const partition = (predicate, arr) =>
arr.reduce((r, o) => {
r[+!!predicate(o)].push(o);
return r;
}, [[], []]);
const arr = [4, 8, 3, 10, 12];
const result = partition(n => n > 5, arr);
console.log(result);
您可以使用分区逻辑和Array.splice()
来创建cherrypick
方法:
if (!Array.prototype.cherrypick) {
Array.prototype.cherrypick = function(predicate) {
const [removedItems, items] = arr.reduce((r, o) => {
r[+!!predicate(o)].push(o);
return r;
}, [[], []]);
this.splice(0, arr.length, items);
return removedItems;
}
}
const arr = [4, 8, 3, 10, 12];
const removed = arr.cherrypick(n => n > 5);
console.log('arr ', arr);
console.log('removed ', removed);
发布于 2018-09-28 23:52:49
只需过滤两次:
const picked = array.filter(fn);
array = array.filter((el, i, a) => !fn(el, i, a));
发布于 2018-09-29 00:06:44
按如下方式使用reduce:
array = [1,2,3,4,5,6,7];
fn = n => n % 3 == 0;
[array, picked] = array.reduce ( (r, el) => (r[+fn(el)].push (el), r), [[], []] )
https://stackoverflow.com/questions/52558800
复制相似问题