2017-07-03 89 views
0

可以说有两个JavaScript阵列。我想知道的是如何获取第二个数组,并查明是否有另一个人与第一个数组中的某人具有相同的favoriteColor。如果有我想要它切换数组。他们保持与他们切换的人一样的位置。任何人都知道如何做到这一点。在两个独立阵列中操作阵列键值

var array1 = [ 
    { 
     name: 'Person 1', 
     favoriteNumber: '1', 
     hairColor: 'Brown', 
     strongHand: 'Left' 
    }, 
    { 
     name: 'Person 2', 
     favoriteNumber: '2', 
     hairColor: 'Brown', 
     strongHand: 'Left' 
    }, 
    { 
     name: 'Person 3', 
     favoriteNumber: '3', 
     hairColor: 'Blonde', 
     strongHand: 'Right' 
    } 

var array2 = [ 
    { 
     name: 'Person 4', 
     favoriteNumber: '2', 
     hairColor: 'Blonde', 
     strongHand: 'Right' 
    }, 
    { 
     name: 'Person 5', 
     favoriteNumber: '22', 
     hairColor: 'Blonde', 
     strongHand: 'Right' 
    } 
+3

你有没有尝试过自己?请显示你已经尝试过 – Li357

+0

没有* favoriteColor *属性。你如何处理重复(使用相同颜色的多个比赛)? – RobG

+0

你的意思是favoriteNumber? – slevy1

回答

0

显然,这个想法是切换在两个阵列相互对象时它们共享相同的最喜欢的数字。要完成这个壮举,for循环需要遍历第一个数组中的每个对象。将每个对象与第二个数组中的对象进行比较,对嵌套的for循环来说效率最高。该交换是特别容易的,如果一个利用这消除了一个临时变量来交换一个很酷的功能:

ES6(Firefox和Chrome已经支持它(解构赋值矩阵匹配))

(见这discussion

var a = [ 
 
    { 
 
    name: "Person 1", 
 
    favoriteNumber: "22", 
 
    hairColor: "Brown", 
 
    strongHand: "Left" 
 
    }, 
 
    { 
 
    name: "Person 2", 
 
    favoriteNumber: "2", 
 
    hairColor: "Brown", 
 
    strongHand: "Left" 
 
    }, 
 
    { 
 
    name: "Person 3", 
 
    favoriteNumber: "3", 
 
    hairColor: "Blonde", 
 
    strongHand: "Right" 
 
    } 
 
]; 
 

 
var b = [ 
 
    { 
 
    name: "Person 4", 
 
    favoriteNumber: "2", 
 
    hairColor: "Blonde", 
 
    strongHand: "Right" 
 
    }, 
 
    { 
 
    name: "Person 5", 
 
    favoriteNumber: "22", 
 
    hairColor: "Blonde", 
 
    strongHand: "Right" 
 
    } 
 
]; 
 

 
function switchOnFav() { 
 
    for (let i = 0, max = 3; i < max; i++) { 
 
    for (let j = 0, mx = 2; j < mx; j++) { 
 
     if (a[i]["favoriteNumber"] == b[j]["favoriteNumber"]) { 
 
     [a[i], b[j]] = [b[j], a[i]]; // ECMS 6 
 
     } 
 
    } 
 
    } 
 
} 
 

 
function showResults(){ 
 
    for (let r = 0, m = 3; r < m; r++) { 
 
    console.log("a[" + r + "]: " + a[r].name); 
 
    } 
 
    for (let s = 0, x = 2; s < x; s++) { 
 
    console.log("b[" + s + "]: " + b[s].name); 
 
    } 
 
} 
 

 
d = document; 
 
d.g = d.getElementById; 
 
var sw = d.g("switch"); 
 
var res = d.g("show"); 
 

 
sw.addEventListener("click",switchOnFav); 
 
res.addEventListener("click",showResults);
button { 
 
background: #00f; 
 
color:#fff; 
 
width:120px; 
 
height:40px; 
 
}
<button id="switch">Switch</button> 
 

 
<button id="show">Show Results</button>

1

我会说只是一个嵌套的循环。它看起来像这样:

for (let i = 0; i < array1.length; i++) { 
    for (let i2 = 0; i2 < array2.length; i2++) { 
     if (array1[i].favoriteNumber == array2[i2].favoriteNumber) { 
      // swap the two people 
      let tmp = array2[i2]; 
      array2[i2] = array1[i]; 
      array1[i] = tmp; 

      break; // found a match, so skip on to the next i value 
     } 
    } 
} 
+0

基本上这将是一个动作按钮代码块。一旦图标被点击与另一个人切换,它将与第一个数组中具有相同favoriteNumber的人切换。 – user3732216