2015-04-21 3 views
2

я знаю, что есть тонны примеров, отвечая на мой вопрос, но я все еще возникаю проблемы, чтобы сделать это:Удалить объект из массива с сращиванием

Вот мой данные:

$scope.data = [ 
    { 
     users:[ 
     {name: 'Stephen', age: 50, dev: 'js', car: 'red', shoes:'green', happy:true, videoGame:[{isPlayer:true, console:'PS3'}]}, 
     {name: 'Stephen', age: 28, dev: 'angular', car: 'gold', shoes:'silver', happy:true, videoGame:[{isPlayer:false, console:'none'}]}, 
     {name: 'Adam', age: 43, dev: 'php', car: 'blue', shoes:'yellow', happy:true, videoGame:[{isPlayer:true, console:'XBOX'}]}, 
     {name: 'John', age: 27, dev: 'java', car: 'green', shoes:'black', happy:true, videoGame:[{isPlayer:true, console:'PC'}]}, 
     {name: 'Steve', age: 29, dev: 'ruby', car: 'white', shoes:'blue', happy:true, videoGame:[{isPlayer:false, console:'none'}]}, 
     {name: 'Pablo', age: 34, dev: 'java', car: 'pink', shoes:'red', happy:false, videoGame:[{isPlayer:true, console:'GAMEBOY'}]} 
     ], 
     futureUsers:[ 
     {name: 'Walter', age: 56, dev: 'js', car: 'red', shoes:'green', happy:true}, 
     {name: 'Jessi', age: 27, dev: 'angular', car: 'gold', shoes:'silver', happy:true}, 
     {name: 'Arnold', age: 34, dev: 'php', car: 'blue', shoes:'yellow', happy:true}, 
     {name: 'Bill', age: 67, dev: 'java', car: 'green', shoes:'black', happy:true}, 
     {name: 'Josh', age: 21, dev: 'ruby', car: 'white', shoes:'blue', happy:true}, 
     {name: 'Sam', age: 31, dev: 'java', car: 'pink', shoes:'red', happy:false} 
     ] 
    } 
     ]; 

Я хочу, чтобы удалить в пользователей пользователь, который имеет свойство видеоигру с isplayer свойство установлено в ложной

Вот что я пытаюсь:

$scope.removeNotPlayer = function(){ 
     for(var i=0; i<$scope.data.users.length; i++){ 
     if($scope.data[i].users.videoGame === false){ 
      $scope.data.splice(i, 1); 
     } 
     } 
     return $scope.data; 
    }; 

вот ссылка на plunker: http://plnkr.co/edit/u4f8Vnds91zu8MNttHr0?p=preview

Любая помощь будет вид, я начинающий, простите мой вопрос, пожалуйста.

+2

Вы итерируете '$ scope.data', а не' $ scope.data.users'. –

+2

Зачем вам «ломаться» на первом ложном случае, что предотвратит удаление каких-либо дополнительных пользователей, у которых может быть значение false. –

+0

@ Майк Брант, я обновил вопрос, спасибо. – adam

ответ

6

Возможно, Array.filter() метод - это то, что вы ищете.

$scope.data[0].users = $scope.data[0].users.filter(function(val) { 
    return (val.videoGame[0].isPlayer === true); 
}); 
+0

Я пробую ваш ответ, но, похоже, проблема с синтаксисом вы можете помочь мне найти его, пожалуйста? – adam

+0

@JaredFarrish, спасибо – adam

+0

большое спасибо! это определенно то, что я ищу;) – adam

1
function filterInPlace(x, fun) { 
    var j=0; 

    for (var i=0; i<x.length; i++) 
     if (fun(x[i])) x[j++] = x[i]; 

    while (x.length > j) 
     x.pop(); 
} 

filterInPlace($scope.data[0].users, function(v) {  
    return v.videoGame[0].isPlayer 
}); 

Функционально эквивалентно вызову Array.filter(), как в предложении Майка Бранта, не создавая дополнительную копию массива.

+0

Хорошее альтернативное предложение для ограниченной памяти. –

1

Если вы хотите следовать «стилю» вашего текущего плунжера, вот фрагмент, который работает.

$scope.removeNotPlayer = function(){ 
     for(var i=0; i<$scope.data[0].users.length; i++){ 
     if($scope.data[0].users[i].videoGame[0].isPlayer === false){ 
      $scope.data[0].users.splice(i, 1); 
     } 
     } 
     return $scope.data; 
    }; 

Для справки, я думаю, решение Майка Бранта чище. Кроме того, ваши данные кажутся излишне сложными. Например, ваши $ scope.data представляют собой массив с одним объектом в нем. Также объект videoGame также завернут в массив. Это добавляет требование [0] и делает ваш код хрупким.

Если у вас есть гибкость, изменяя свои данные:

$scope.data = { 
     users:[ 
     {name: 'Stephen', age: 50, dev: 'js', car: 'red', shoes:'green', happy:true, videoGame:{isPlayer:true, console:'PS3'}}, 
     {name: 'Stephen', age: 28, dev: 'angular', car: 'gold', shoes:'silver', happy:true, videoGame:{isPlayer:false, console:'none'}}, 
     {name: 'Adam', age: 43, dev: 'php', car: 'blue', shoes:'yellow', happy:true, videoGame:{isPlayer:true, console:'XBOX'}}, 
     {name: 'John', age: 27, dev: 'java', car: 'green', shoes:'black', happy:true, videoGame:{isPlayer:true, console:'PC'}}, 
     {name: 'Steve', age: 29, dev: 'ruby', car: 'white', shoes:'blue', happy:true, videoGame:{isPlayer:false, console:'none'}}, 
     {name: 'Pablo', age: 34, dev: 'java', car: 'pink', shoes:'red', happy:false, videoGame:{isPlayer:true, console:'GAMEBOY'}} 
     ], 
     futureUsers:[ 
     {name: 'Walter', age: 56, dev: 'js', car: 'red', shoes:'green', happy:true}, 
     {name: 'Jessi', age: 27, dev: 'angular', car: 'gold', shoes:'silver', happy:true}, 
     {name: 'Arnold', age: 34, dev: 'php', car: 'blue', shoes:'yellow', happy:true}, 
     {name: 'Bill', age: 67, dev: 'java', car: 'green', shoes:'black', happy:true}, 
     {name: 'Josh', age: 21, dev: 'ruby', car: 'white', shoes:'blue', happy:true}, 
     {name: 'Sam', age: 31, dev: 'java', car: 'pink', shoes:'red', happy:false} 
     ] 
    }; 

бы, скорее всего, сделает вашу жизнь проще в долгосрочной перспективе.

+0

спасибо человеку. Я понимаю, что данные кажутся излишне сложными, но я удаляю из него много вещей, чтобы мой вопрос был менее запутанным. благодаря времени, чтобы следовать стилю моего вопроса. – adam

Смежные вопросы