在数组js

时间:2018-09-24 20:26:34

标签: javascript ecmascript-6 functional-programming

我想要实现的是使数组中的每个元素都与其他元素不同且唯一。

因此,如果您想象这样的数组:

let myArray = Array(10, 10, 10, 10, 9);

我想通过这样的算法:

  1. 使数组的第一个元素(10)(索引= 0)。
  2. 检查数组中是否存在具有相同值的元素。是的,有-索引为1。如果不是,请检查下一个元素...
  3. 将myArray [0]更改为myArray [0] + 1
  4. 将myArray [1]更改为myArray [1]-1
  5. 返回myArray

现在的数组看起来像这样:

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。

1 个答案:

答案 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; }