Удалить значение массива, если уже существует JavaScript

0

У меня есть массив значений, которые я показываю с помощью ng-repeat. Когда я нажимаю на один из них, я добавляю это значение в другой массив. Если он уже существует, я удаляю его. Здесь хорошо работает. Но у меня есть кнопка, которая толкает весь массив во второй. Он работает, но я могу подтолкнуть весь массив к бесконечным временам, даже если значение уже существует. Конечно, если я проверю одно или два значения, а затем нажимаю "Выбрать все", он должен выбрать все значения, которые уже выбирают с помощью одного выбора. Кстати, это код с jsfiddle:

var myApp = angular.module('myApp',[]);

function MyCtrl($scope) {
    $scope.all_titles = [
        "Title 1",
        "Title 2",
        "Title 3",
        "Title 4"
        ];

    $scope.selection=[];

    $scope.getSelectedItem = function getSelectedItems(title) {
            var idx = $scope.selection.indexOf(title);
            // is currently selected
            if (idx > -1) {
                $scope.selection.splice(idx, 1);
            }
            // is newly selected
            else {
                if(Array.isArray(title)) {
                    for(var i=0;i<title.length;i++) {
                        $scope.selection.push(title[i]);
                    }
                } else {
                    $scope.selection.push(title);
                }
            }
        };
}

<div ng-controller="MyCtrl">
    <div>
        <button data-ng-click="getSelectedItem(all_titles)">
            Select all
        </button>
    </div>
    <div ng-repeat="title in all_titles">
        <a ng-click="getSelectedItem(title)">{{title}}</a>
    </div>

    <hr>
    <div>
        {{selection}}
    </div>
</div>

http://jsfiddle.net/HB7LU/20342/

  • 0
    это то, чего ты хочешь? jsfiddle.net/L1Lf8yau не совсем понятно, как должна работать кнопка выбора всех.
  • 0
    Вовсе нет .. потому что таким образом, если вы нажмете одну, а затем в «Выбрать все», он выберет все, кроме той, которую вы выбрали ранее.
Теги:
arrays

3 ответа

2
Лучший ответ

Вы сценарий мне не совсем понятен.

Если вы хотите, чтобы кнопка "Выбрать все" вела себя так, как нажимают все ссылки, это ваше решение:

$scope.getSelectedItem = function getSelectedItems(title) {
            if(Array.isArray(title)) {
                for(var i=0;i<title.length;i++) {
                    $scope.pushIt(title[i]);
                }
            } else {
                $scope.pushIt(title);
            }

    };

$scope.pushIt = function pushIt(title) {
        var idx = $scope.selection.indexOf(title);
        // remove if already in array
        if (idx > -1) {
            $scope.selection.splice(idx, 1);
        } else {
            $scope.selection.push(title);
        }
    };

Если вы хотите, чтобы кнопка "Выбрать все" добавляла оставшиеся элементы, это ваше решение:

$scope.getSelectedItem = function getSelectedItems(title) {

    if (Array.isArray(title)) {
        for (var i = 0; i < title.length; i++) {
            var idx = $scope.selection.indexOf(title[i]);
            // don't add if already in the array
            if (idx == -1) {
                $scope.selection.push(title[i]);
            }
        }
    } else {
        var idx = $scope.selection.indexOf(title);
        // is currently selected
        if (idx > -1) {
            $scope.selection.splice(idx, 1);
        } else {
            $scope.selection.push(title);
        }
    }

};
  • 0
    Ваше второе решение - то, что мне нужно !! Отлично спасибо!
0

Ваш код работает, но вам нужно создать другое

for(var i=0;i<title.length;i++) {
 var n_idx = $scope.selection.indexOf(title[i]);
 if( n_idx == -1){
   $scope.selection.push(title[i]);
 }else{
   $scope.selection.splice(n_idx, 1);
 }
}


var myApp = angular.module('myApp',[]);

//myApp.directive('myDirective', function() {});
//myApp.factory('myService', function() {});

function MyCtrl($scope) {
    $scope.all_titles = [
        "Title 1",
        "Title 2",
        "Title 3",
        "Title 4"
        ];

    $scope.selection=[];

    $scope.getSelectedItem = function getSelectedItems(title) {
            var idx = $scope.selection.indexOf(title);
            // is currently selected
            if (idx > -1) {
                $scope.selection.splice(idx, 1);
            }
            // is newly selected
            else {
                if(Array.isArray(title)) {
                    console.log("YES");
                    for(var i=0;i<title.length;i++) {
                        var n_idx = $scope.selection.indexOf(title[i]);
                        if( n_idx == -1){
                            $scope.selection.push(title[i]);
                        }else{
                            $scope.selection.splice(n_idx, 1);
                        }
                    }
                } else {
                    $scope.selection.push(title);
                }
            }
        };
}
0

Нецач прав относительно ошибки.

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

    if($scope.selection[title]){
        delete $scope.selection[title];
    } else {
        $scope.selection[title] = true;
    }

Вот пример jsfiddle для рабочего примера:

http://jsfiddle.net/HB7LU/20348/

Ещё вопросы

Сообщество Overcoder
Наверх
Меню