for(让我在字符串中){}等于for(让i = 0; i <string.length; i ++){}吗?

时间:2018-12-24 18:39:31

标签: javascript for-loop for-in-loop

我写了两段代码,我想它们应该一样工作。您可能会注意到,两者之间唯一不同的是for循环的声明。

为什么带有for-in的代码无法按预期运行?

谢谢。

const allPermutations1 = s => {
     let permutations = []

     const recursion = (s, p = '') => {

         if (s.length === 0) return permutations.push(p)

         for (let i = 0; i < s.length; i++)
             recursion(s.slice(0, i) + s.slice(i+1), p + s[i]) 
     }

     return (recursion(s), permutations)
 }

allPermutations1('123') // ["123", "132", "213", "231", "312", "321"]

const allPermutations2 = s => {
    let permutations = []

    const recursion = (s, p = '') => {

        if (s.length === 0) return permutations.push(p)

        for (let i in s)
            recursion(s.slice(0, i) + s.slice(i+1), p + s[i]) 
    }

    return (recursion(s), permutations)
}

allPermutations2('123') // ["123", "132", "21", "312", "321"]

2 个答案:

答案 0 :(得分:2)

一个for...in循环遍历键并返回一个字符串。在接头内应用i+1迭代器时,您将返回字符串串联而不是递增值。例如,'1' + '2''12'而不是3。正确拼接数字时,这种情况可能会导致问题。您需要将密钥解析为数字才能执行预期的操作。

答案 1 :(得分:1)

const allPermutations2 = s => {
    let permutations = [];

    const recursion = (s, p = "") => {
        if (s.length === 0) return permutations.push(p);

        for (let i in s) {
            recursion(
                s.slice(0, parseInt(i)) + s.slice(parseInt(i) + 1),
                p + s[parseInt(i)]
            );
        }
    };
    return recursion(s), permutations;
};

将产生与第一个相同的结果。当您为..输入时,键是字符串。