簡體   English   中英

jQuery比較兩組對象並獲取差值的位置

[英]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.idthis.r3代替vOld.idvOld.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM