2016-01-01 78 views
0

我的使用angularJS,和具有2點陣列如下面angularJS第二陣列的更新陣列基本值

$scope.varStr = [{"subjectId":"1","subjectShortName":"English"}, 
      {"subjectId":"2","subjectShortName":"French"}, 
      {"subjectId":"3","subjectShortName":"German"}, 
      {"subjectId":"4","subjectShortName":"Latin"}, 
      {"subjectId":"5","subjectShortName":"English-Aus"} 
      ]; 

$scope.varStr2 = [{"subjectId":"1","subjectShortName":"English"}, 
      {"subjectId":"5","subjectShortName":"English-Aus"} 
      ]; 

基地類似值的$ scope.varStr2,UPDATE $ scope.varStr subjectId或創建新的$範圍.varStr3如下面新的關鍵「IsSelected」:真/假

$scope.varStr3 = [{"subjectId":"1","subjectShortName":"English","IsSelected": true}, 
      {"subjectId":"2","subjectShortName":"French","IsSelected": false}, 
      {"subjectId":"3","subjectShortName":"German","IsSelected": false}, 
      {"subjectId":"4","subjectShortName":"Latin","IsSelected": false}, 
      {"subjectId":"5","subjectShortName":"English-Aus","IsSelected": true} 
      ];    

for (var index = 0; index < varStr.length; index++) { 
       if (varStr[index].subjectId == varStr2[index].subjectId) { 
        varStr.push("'IsSelected':'true'"); 
       } 
      } 
+1

這與AngularJS無關。這是一個純粹的JavaScript /算法問題。你有嘗試過什麼嗎?你面臨什麼困難?或者你只是想讓我們爲你寫代碼? –

+0

代碼添加。錯誤是'subjectId'未定義 – fresher

+0

也試圖實現從angularJS.extend – fresher

回答

0

嘗試用波紋管迴路它會爲你工作。

for (i = 0; i < $scope.varStr.length; i++) { 

    $scope.varStr[i].IsSelected = false; 
    for (j = 0; j < $scope.varStr2.length; j++) { 
    if ($scope.varStr[i].subjectId == $scope.varStr2[j].subjectId) { 
     $scope.varStr[i].IsSelected = true; 
    } 
    } 
} 
2

你的代碼有很多問題,都是非常基本的問題,所以我建議你修改算法和JavaScript的基礎知識。我會盡力解釋我能做到的最好,但這不能取代讀好書和練習。

讓我們來看看你的代碼:

for (var index = 0; index < varStr.length; index++) { 
    if (varStr[index].subjectId == varStr2[index].subjectId) { 
     varStr.push("'IsSelected':'true'"); 
    } 
} 

這裏有三個重要問題:

  1. 你假設在varStrvarStr2匹配的對象相同指數。但事實並非如此。例如,具有subjectId=5的對象位於第一個數組中的索引4處,但位於第二個索引處的索引處。所以這是不正確的。對於varStr的每個元素,您需要執行的操作是測試具有相同subjectId的對象是否存在,位於varStr2
  2. 您的目標是更新varStr中的對象。但這不是你在做的:你正在推動(即增加)新元素到varStr
  3. varStr包含需要更新的對象,但添加到數組中的內容不是對象。這是一個字符串。

這裏有一個詳細的固定算法:

function update(varStr, varStr2) { 
    for (var index = 0; index < varStr.length; index++) { 
     var currentObject = varStr[i]; 
     var currrentSubjectId = currentObject.subjectId; 
     currentObject.isSelected = existsObjectWithGivenSubjectId(currentSubjectId, varStr2); 
    } 
} 

function existsObjectWithGivenSubjectId(subjectId, array) { 
    for (var i = 0; i < array.length; i++) { 
     if (array[i].subjectId === subjectId) { 
      return true; 
     } 
    } 
    return false; 
} 

現在,這應該是通過使用陣列功能更短的方式寫的,但你應該先纔去這樣理解的版本。

您還應該爲變量選擇更好的名稱。命名它們varXxx是無用的。變量是一個變量,並且var不需要在其名稱中。你將它們命名爲varStr,它提示它們是字符串類型,這是不正確的:它們是對象數組。 Andyour變量名稱不會告訴它們包含的內容。例如,您的變量可以被命名爲originalSubjectsselectedSubjects

最後,將所有對象關鍵字用引號引起來,使得代碼的可讀性比它可能低。使用字符串作爲subjectIds也很奇怪,因爲它們似乎是整數。你可以用下面的代碼代替:

$scope.varStr = [ 
    { 
     subjectId: 1, 
     subjectShortName: "English" 
    }, 
    { 
     subjectId: 2, 
     subjectShortName: "French" 
    }... 
]; 
+0

非常有幫助 – fresher

+0

@JB再次感謝...我正在學習:) – fresher

+0

@JB Nizet很好的回答+1;) –