我想在JavaScript中的Set(0..n)上创建置换。
我在Array方法上苦苦挣扎:其中有些像map
返回一个可以进一步修改的新数组,有些像forEach
则没有。要编码排列,我只能通过增强Array原型来做到这一点:
Object.defineProperty(Array.prototype, "chain", {
value: function(method, arg) {
this[method].call(this, arg);
return this;
}
});
Object.defineProperty(Array.prototype, "value", {
value: value => value // to value value ;-)
});
只有那时我才能够编码排列:
let perm = (n) =>
n==0 ? [[0]] :
perm(n-1).reduce((acc, cur) =>
cur.chain("forEach", (_, i) =>
acc.chain("push", [...cur.slice(0,i), n, ...cur.slice(i)])
).value(acc).chain("push", [...cur,n])
,[])
测试:
console.log(perm(2));
因此,在ES6中(不添加到Array原型中)以纯功能方式对Set(或任何类似Array的对象)上的排列进行编码是可行的吗?
[我不想强奸Javascript(就像jQuery当时那样),以强制它采用一些非本地的范例,但我想充分了解其在功能领域的潜力。
根本不需要ES6。如果要以函数样式编程,则不要使用forEach
或push
-将其隐藏在chain
方法中,以便您可以编写具有有用返回值的表达式无济于事。