我正在尝试创建一个函数来移动数组内元素的位置。
例如,我有这个数组:
[1,2,3]-如果我调用该函数,我会得到这个=> [2,3,1]; 如果再次调用该函数,则应具有=> [3,1,2]; 下次应该再次移动,依此类推。 但是,相反,如果我第二次调用该函数,则会再次得到此信息=> [2,3,1];
我该如何使其正常工作?
我知道为什么会这样,每当我调用该函数以相同的顺序接收相同的值时,我就明白了,这就是为什么我建立了另一个数组(移动)以当前顺序接收值的原因,尝试第二次使用该新数组时,我使用if / else语句尝试了该函数,但是没有用;我还构建了另一个函数,将“ move”作为参数传递,并且它起作用了,但是我没有必要为每个动作都使用不同的函数。
p.s。我正在从HTML输入中接收值。
<input id="numero1" value="">
<button onclick="moveLeft()">Move</button>
var n1 = document.getElementById("numero1");
function moveLeft() {
var str = n1.value;
var arr = str.split('');
var move = [];
console.log(arr);
arr.splice(0, 3, arr[1], arr[2], arr[0]);
console.log(arr);
for (var i = 0; i < arr.length; i++) {
move.push(arr[i]);
}
console.log(move);
teste(move);
}
function teste(move) {
console.log(move);
move.splice(0, 3, move[1], move[2], move[0]);
console.log(move);
}
答案 0 :(得分:3)
如果我理解正确,我认为您可以简化一项功能:
const moveLeft = (arr) => arr.push(a.shift());
请注意,此函数将使数组的内容发生变化,但我想您想要的是
const array = [1, 2, 3];
moveLeft(array);
console.log(array)// [2, 3, 1]
moveLeft(array);
console.log(array)// [3, 1, 2]
moveLeft(array);
console.log(array)// [1, 2, 3]
基本上,我们使用push在数组的末尾添加了一个新元素,而我们添加的新元素是方法shift的返回值,该方法从数组中删除了第一个元素并退回。
修改
如果您不想突变原始数组,最快的方法是创建一个浅表副本并将其传递给函数:
const newArray = array.slice();
moveLeft(newArray);
console.log(newArray, array) // [2, 1, 3] [1, 2, 3]
但是,始终返回新数组的可能实现可能是:
const moveLeft = (arr) => [...arr.slice(1), arr[0]]
仅供将来参考。但是请记住,这里您要创建一个浅表副本(因此需要一个新数组),并从spread运算符返回一个新数组,因此不太理想。仅当您编写永远不允许可变性的API时,它才有用。
编辑2
根据评论,input
的值应反映新的顺序,因此,考虑到之前编写的moveLeft
函数(第一个修改内容的函数):
<input id="numero1" value="">
<button onclick="inputMoveLeft('numero1')">Move</button>
还有JS:
function inputMoveLeft(id) {
const input = document.getElementById(id);
input.value = moveLeft(input.value.split("")).join("");
}
它应该可以为您提供想要的结果。
答案 1 :(得分:0)
发出并移动声音就像您需要的东西:
function rotateLeft(array){
let first = array.shift()
array.push(first); // add to end
return array;
}
function rotateRight(array){
let last = array.pop()
array.unshift(last); // add to front
return array;
}