#前置き
前回
フィルタでfalsyな要素はSymbol('ignore')
を返すようにする。
#function
const APPS = {
ignore: Symbol('ignore'),
filterMap: (array, func) => {
const arr = array.slice();
const res = [];
for (let i=0,len=arr.length; i<len; i++) {
const v = func(arr[i], i, arr);
if (v!==APPS.ignore) res.push(v);
}
return res;
}
};
const arr = [...Array(10).keys()];
const chunk = APPS.filterMap(arr, (x,i,a) => i%3===0 ? a.slice(i,i+3) : APPS.ignore);
console.log( chunk ); //[[0, 1, 2], [3, 4, 5], [6, 7, 8], [9]]
これもdefineProperty
を使って設定したほうが良かったかも?
const APPS = {
ignore: Symbol('ignore')
};
Object.defineProperties(APPS, {
ignore: {
writable: false,
},
filterMap: {
value: (array, fn) => {
const arr = array.slice();
const res = [];
for (let i=0,len=arr.length; i<len; i++) {
const v = fn(arr[i], i, arr);
if (v!==APPS.ignore) res.push(v);
}
return res;
},
},
});
#Array.prototype
if (!Array.prototype.filterMap && !this.ignore) {
Object.defineProperty(Array.prototype, 'filterMap', {
value: function(fn) {
const arr = this;
const res = [];
for (let i=0,len=arr.length; i<len; i++) {
const v = fn(arr[i], i, arr);
if (v!==ignore) res.push(v);
}
return res;
},
});
const ignore = Symbol('ignore');
Object.defineProperty(this, 'ignore', {
get() {
return ignore;
}
});
};
const arr = [...Array(10).keys()];
const chunk = arr.filterMap((x,i,a) => i%3===0 ? a.slice(i,i+3) : ignore);
console.log( chunk ); //[[0, 1, 2], [3, 4, 5], [6, 7, 8], [9]]
ignoreをthis.ignore
ではなくArray
内部に留めたかったけど、しっくりこなかった。