在JavaScript中将项目从一个数组交换到另一个数组的优雅方式?

时间:2018-01-10 18:49:28

标签: javascript arrays oop object prototype

是否有一种优雅的方法可以使用vanilla JS将项目从一个数组交换到另一个数组?

如果您正在为运动队构建一个简单的应用程序,此功能将起作用。在给定的团队中,当你从一个首发阵容(array1)中交换一个玩家时,你可以用替代阵容(array2)中的一个玩家替换它们。

一旦做出选择,阵列就会更新,阵列2中的选定数组项现在出现在数组1中,反之亦然。

  

伪代码示例:
  首发阵容=鲍勃,苏珊,凯文,杰克,蒂姆   优势阵容=乔治,史蒂夫,玛莎   
  玩家分出:杰克
  玩家分到:Martha
  
   // JS Magic激活! (在此处插入您的巧妙代码。)
  
  结果:   
  首发阵容:Bob,Susan,Kevin,Martha,Tim
  替补阵容:乔治,史蒂夫,杰克   

我找到了swap the order of two items in a single array, using a prototype method的优雅解决方案。但是,如果您处理两个不同数组中的两个项目,这将无效。

我的问题不是关于解决方案是否可行(当然是这样),而是最佳方式是什么,使用干净,精确和优雅的代码,而不需要对于一堆for-loop意大利面。

2 个答案:

答案 0 :(得分:2)

不富有魅力,也许会错过你的情绪 - 但是你可以用两行来做到这一点

var Starting_Lineup = ["Bob", "Susan", "Kevin", "Jack", "Tim"];
var Substitute_Lineup = ["George", "Steve", "Martha"];

/*
Player to sub out: Jack
Player to sub in: Martha
*/

// JS Magic Activates! (Insert your ingenious code here.)
Starting_Lineup[Starting_Lineup.indexOf("Jack")]="Martha";
Substitute_Lineup[Substitute_Lineup.indexOf("Martha")]="Jack";


/*
Result: 
Starting Lineup: Bob, Susan, Kevin, Martha, Tim
Substitute Lineup: George, Steve, Jack
*/

如果你想要一个功能:

var Starting_Lineup = ["Bob", "Susan", "Kevin", "Jack", "Tim"];
var Substitute_Lineup = ["George", "Steve", "Martha"];

/*
Player to sub out: Jack
Player to sub in: Martha
*/

[Starting_Lineup,Substitute_Lineup]=swap_player(Starting_Lineup,Substitute_Lineup,"Jack","Martha");

function swap_player(team_1,team_2,player_1,player_2){
  team_1[team_1.indexOf(player_1)]=player_2;
  team_2[team_2.indexOf(player_2)]=player_1;
  return [team_1,team_2];
}

答案 1 :(得分:2)

您可以获取所需元素的索引并使用destructuring assignment



var swap = (a1, a2, v1, v2) => {
        var i = a1.indexOf(v1),
            j = a2.indexOf(v2);

        [a1[i], a2[j]] = [a2[j], a1[i]];
    },
    array1 = ['Bob', 'Susan', 'Kevin', 'Jack', 'Tim'],
    array2 = ['George', 'Steve', 'Martha'];

swap(array1, array2, 'Jack', 'Martha')

console.log(array1);
console.log(array2);

.as-console-wrapper { max-height: 100% !important; top: 0; }