所有第一个数组元素替换为第二个数组的最后一个元素

时间:2018-08-09 10:47:17

标签: javascript arrays closures

我正在尝试使用另一个数组从一个数组中列出一对。

function pair(currentPlayer) {
let mainSet = [];
let subSet = [currentPlayer[0], currentPlayer[1], currentPlayer[2]];

for(let i = 0; i < currentPlayer.length - 2; i++) {
    for(let j = 3; j < currentPlayer.length; j++) {
        let set = function() {
            return currentPlayer[j];
        }

        subSet[i] = set();
        mainSet.push(subSet);
    }
}

return mainSet;
}

console.log(pair([0, 2, 5, 7, 8]));

我得到了这个输出

[ [ 8, 8, 8 ],[ 8, 8, 8 ],[ 8, 8, 8 ],[ 8, 8, 8 ],[ 8, 8, 8 ],[ 8, 8, 8 ] ]

子数组的所有数组元素都替换为主数组的最后一个元素。我知道主集的最后一个元素用于所有由于词汇环境结构而要替换的元素。我尝试了代码的不同变体,例如使用在范围外声明的第三个变量。所有趋向于给出相同的输出。

此代码的结构是否存在问题。因为我假设代码的输出应该像子集的每个元素分别被第3个元素和第4个元素替换,并且该对应该推到主集合中。

2 个答案:

答案 0 :(得分:0)

首先要使其正常运行,您可以用以下代码替换代码:

function pair(currentPlayer) {
let mainSet = [];
let subSet = [currentPlayer[0], currentPlayer[1], currentPlayer[2]];

for(let i = 0; i < currentPlayer.length - 2; i++) {
    for(let j = 3; j < currentPlayer.length; j++) {
        let set = function() {
            return currentPlayer[j];
        }

        subSet[i] = set();
        mainSet.push(Object.assign([],subSet));
    }
}

return mainSet;
}

console.log(pair([0, 2, 5, 7, 8]));

现在,一些解释: 您可能已经注意到,我已经更改了推送功能。 在当前代码中,您始终推送相同的数组。就像在javascript数组中通过引用传递一样,如果数组中的值更改,则最终数组将被更新。 您必须中断对数组的引用(例如创建新数组)

如果您不熟悉Object.assign,则可以执行以下操作:

for(let i = 0; i < currentPlayer.length - 2; i++) {
    let arr = [];
    for(let j = 3; j < currentPlayer.length; j++) {
        let set = function() {
            return currentPlayer[j];
        }

        arr[i] = set();
        mainSet.push(subSet);
    }
} 

答案 1 :(得分:0)

希望这会有所帮助。

var array1 = [0, 2, 5, 7, 8];

// pass a function to map
const map1 = array1.map(function(x, i, arr) {
  return (i>2) ? arr.slice(3) : x;
});

console.log(map1);
// output: Array [0, 2, 5, [7, 8], [7, 8]]
干杯,