[英]jQuery compare two sets of objects and get the location of the difference in the value
關於在本網站上比較兩組JavaScript對象有很多問題,但是我找不到我想要實現的目標。
我有兩組對象,如下所示。
var players = [
{ "id" : "45783",
"r3" : "DED" },
{ "id" : "54762",
"r3" : "DEDCCCCDDDDC" },
{ "id" : "78903",
"r3" : "DEDCDBDDDDDC"}
]
var oldPlayers = [
{ "id" : "45783",
"r3" : "DE" },
{ "id" : "54762",
"r3" : "DEDCCCCDDDD" },
{ "id" : "78903",
"r3" : "DEDCDBDDDDD"}
]
我想比較上面的數據並找到var播放器中的確切位置,“ r3”值與oldPlayers不同。
例如,
players ---- "r3" : "DED"
oldPlayers - "r3" : "DE"
以上數據的不同之處在於,假設數字從0開始,玩家在[2]處的角色位置還有D。
我打算讓每個循環到達此位置,並且我陷於如何使其工作的困境。
var isOldPlayers = false;
// check if oldPlayers exists
if(oldPlayers != undefined && oldPlayers != ''){
isOldPlayers = true;
}
$.each(players,function(i,v){
if(isOldPlayers){
var oldScores = oldPlayers[i]['r3'];
var newScores = this['r3'];
if(newScores != oldScores){
// how can I get the exact location of the difference?
}
}
});
它可以加快使用陣列的速度。 如果字符串將包含與上述字符幾乎相同的字符,那么這將是一個不錯的方法。 這對你有用嗎?
var dIdx = [v['r3'], oldPlayers[i]['r3']].sort()[0].length;
// ["DED", "DE"].sort() --> ["DE", "DED"];
// ["DE", "DED"][0] --> "DE"
// "DE".length --> 2
// "DED" differs from "DE" at index 2
或者,如果您需要差異本身,則可以執行以下操作:
var scores = [v['r3'], oldPlayers[i]['r3']].sort(),
diff = scores[1].substr(scores[0].length);
需要明確的是,您不需要制作“ players
”對象數組。 點擊圖片進行演示。
var players = [
{ "id" : "45783",
"r3" : "DED" },
{ "id" : "54762",
"r3" : "DEDCCCCDDDDC" },
{ "id" : "78903",
"r3" : "DEDCDBDDDDDC"}
],
oldPlayers = [
{ "id" : "45783",
"r3" : "DE" },
{ "id" : "54762",
"r3" : "DEDCCCCDDDD" },
{ "id" : "78903",
"r3" : "DEDCDBDDDDD"}
];
var desc = '';
$.each(players, function(i, v) {
var dIdx = [v['r3'], oldPlayers[i]['r3']].sort()[0].length;
desc += '<span class="h">' + v['r3'] + '</span> ' +
'and <span class="h">' + oldPlayers[i]['r3'] + '</span> ' +
'differ at index: <span class="hg">' + dIdx + '</span><br><br>';
});
$('body').html(desc);
如果我對您的理解正確,這應該可以滿足您的需求:
var players = [ { "id" : "45783", "r3" : "DED" }, { "id" : "54762", "r3" : "DEDCCCCDDDDCDEWE" }, // I added chars here to show how to get the rest of the string that is different { "id" : "78903", "r3" : "DEDCDBDDDDDC"} ] var oldPlayers = [ { "id" : "45783", "r3" : "DE" }, { "id" : "54762", "r3" : "DEDCCCCDDDD" }, { "id" : "78903", "r3" : "DEDCDBDDDDD"} ] $.each(players,function(index, element){ var newR3= players[index]["r3"].split(''); var oldR3= oldPlayers[index]["r3"].split(''); var curId= players[index]["id"]; $.each(newR3,function(i, el){ if(el != oldR3[i]){ $('#myDiv').append('Object '+index+' (id '+curId+') in players is different than object '+index+' (id '+curId+') in oldPlayers starting at index: '+i +'<br>'); $('#myDiv').append('The rest of the string, from the fist difference to the end is: ' + newR3.slice(i).join('') +'<br><br>'); return false; } }); });
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <div id="myDiv"></div>
這是一種解決方案:
$.each(players,function(iNew,vNew){
if(isOldPlayers){
$.each(oldPlayers,function(iOld,vOld){
if(vNew.id === vOld.id && vNew.r3 !== vOld.r3){
console.log('players ----- "r3" : ' + vNew.r3 + '\noldPlayers ----- "r3" : ' + vOld.r3);
}
});
}
});
請注意,您需要兩個內部循環,外部一個循環播放器,而對於每個循環,內部一個循環播放oldPlayers數組以尋找匹配項。
在內部循環中,可以使用this.id
和this.r3
代替vOld.id
和vOld.r3
。 但是,此代碼效率不高,因為您必須為第一個數組的每個元素遍歷第二個數組的所有元素。 如果您知道所有ID都是唯一的,則可以通過使用傳統的for
循環進一步改進它for
並在找到ID匹配項后立即將其斷開:
$.each(players,function(iNew,vNew){
if(isOldPlayers){
for (var i = 0, len = oldPlayers.length ; i < len ; i += 1) {
if(vNew.id === oldPlayers[i].id) {
if(vNew.r3 !== oldPlayers[i].r3){
console.log('players ----- "r3" : ' + vNew.r3 + '\noldPlayers ----- "r3" : ' + oldPlayers[i].r3);
}
break;
}
}
}
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.