我想要实现的是使数组中的每个元素都与其他元素不同且唯一。
因此,如果您想象这样的数组:
let myArray = Array(10, 10, 10, 10, 9);
我想通过这样的算法:
现在的数组看起来像这样:
myArray = Array(11, 9, 10, 10, 9)
现在,它再次运行,接下来的步骤将返回该数组:
myArray = Array(11, 10, 10, 10, 8)
myArray = Array(11, 11, 9, 10, 8)
myArray = Array(12, 10, 9, 10, 8)
myArray = Array(12, 11, 9, 8, 8)
myArray = Array(12, 11, 10, 9, 7)
现在,因为只有唯一的值,所以完成了。 使用while和for循环很容易做到这一点,但是如何使用ES6函数编程来实现呢?
K。
答案 0 :(得分:2)
如果找到两个相同的值,则可以使用带有短路的嵌套迭代。
function fn(array) {
return array.some((v, i, a) => a.slice(i + 1).some((w, j) => {
if (v === w) {
++a[i];
--a[i + j + 1];
return true;
}
}));
}
var array = [10, 10, 10, 10, 9];
console.log(array.join(' '));
while (fn(array)) console.log(array.join(' '));
.as-console-wrapper { max-height: 100% !important; top: 0; }
更具功能性的样式,它将返回一个新数组
const
init = j => (v, i, a) => j !== -1
? i === j ? v - 1 : v
: (j = a.indexOf(v, i + 1)) !== -1 ? v + 1 : v,
upDown = () => init(-1);
var array = [10, 10, 10, 10, 9];
do {
console.log(array.join(' '))
} while (array.join() !== (array = array.map(upDown())).join())
.as-console-wrapper { max-height: 100% !important; top: 0; }