2013-05-28 93 views
1

我想穿過一個JSON,如果某個條件適用,然後在該索引中推送一些額外的元素。將元素推入JSON對象

我有這樣的JS代碼:

$scope.addRoleToUser = function() { 
    var userid = $scope.selectedUser; 
    var tmpdata = []; 
    var index = 0; 
    //alert(userid); 
    angular.forEach($scope.users, function(data) { 

     if (data.id == $scope.selectedUser) { 
      tmpdata.push(data,{"roles":[{"id":"00","name":"newrole"}]}); 
     } 
     else { 
      tmpdata.push(data); 
     } 
     index++; 
    }); 
    $scope.users = tmpdata; 
}; 

這是我最初的JSON元素:

$scope.users = [ 
        {"id":"0","name":"User1","roles":[{}]}, 
        {"id":"1","name":"User2","roles":[{}]}, 
       ] 

我試圖讓它看起來像這樣的功能之後運行:

$scope.users = [ 
        {"id":"0","name":"User1","roles":[{"id":"00","name":"newrole"}]}, 
        {"id":"1","name":"User2","roles":[{}]}, 
       ] 

但是,我得到這個:

[{"id":"0","name":"User1","roles":[{}]},{"roles":[{"id":"00","name":"newrole"}]},{"id":"1","name":"User2","roles":[{}]}] 
+0

你能提供一個小提琴嗎?我不確定$ scope.selectedUser是什麼樣子的。 –

+0

''scope.selectedUser''是一個應該匹配其中一個''user.id''的數字 – user838437

回答

1

只需更換這是你的功能

if (data.id == $scope.selectedUser) { 
    data.roles = [{"id":"00","name":"newrole"}]; 
} 

裏面或者,如果你知道角色是不是空的,你可以這樣做:

if (data.id == $scope.selectedUser) { 
    data.roles.push({"id":"00","name":"newrole"}); 
} 

而此行後,您可以將數據添加到tmpdata僞!

那現在片段將是這樣的:

if (data.id == $scope.selectedUser) { 
    data.roles = [{"id":"00","name":"newrole"}]}); //or the other one 
} 
tmpdata.push(data); 
+0

這很好,謝謝 – user838437

1

裏面的forEach()回調你只是使用對象和這樣的工作,你可以直接修改它們的回調中:

angular.forEach($scope.users, function(data) { 
    if (data.id == $scope.selectedUser) { 
     data.roles = [{"id":"00","name":"newrole"}]; 
    } 
}); 

同樣,您可以通過操作各自的data對象來修改每個條目的幾乎任何內容。

Example Fiddle

+0

現在它是一個(trupe?)重複lol –

+0

@LightStyle Typo。更正 – Sirko

+0

@LightStyle不完全是這樣,我一般認爲最好是在思考過程中解釋錯誤/誤解,而不是僅僅提供正確的代碼 – Sirko

0

的Array.prototype.push方法是可變參數:(https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/push)。

當您撥打tmpdata.push(a,b,c)時,實質上是將陣列[a,b,c]附加到tmpdata

您也可以用類似分解問題:

$scope.addRoleToUser = function() { 
    var thisUserid = $scope.selectedUser; 

    function addRolesFor(user) { 
    if (user.id === thisUserId){ user.roles = [{"id":"00","name":"newrole"}] }; 
    return user; 
    } 
    retrun $scope.users.map(addRoles); 
} 

請使用map功能適合於您的環境(如_.map),因爲Array.prototype.map方法並非所有瀏覽器都支持。