无法使array.splice在Angular中工作

时间:2015-11-11 10:43:13

标签: javascript angularjs

我有一个对象words和一个复选框,它应该隐藏这个对象的特定元素,但我无法让它工作。

<body ng-controller="ArrController">
    <input type="checkbox" ng-model="hide"> {{kc}} 
    {{words}}
</body>

ArrController

app.controller('ArrController', function ($scope, $http) {

 $scope.hide = false;

 $http.get('array.json').success(function(data) {
    var keyword = 'lol';
     $scope.words = data.unsorted_arr;
   $scope.$watch('hide', function () {
        if ($scope.hide == true) {
            var remove = function() { 
                $scope.words.splice(keyword, 1);     
            }
            $scope.kc = 'hidden';
        } else {
            $scope.kc = 'not hidden';
            $scope.words = data.unsorted_arr;
        }
    });

 });
});

文件array.json包含words的数据:

{"unsorted_arr":{"gonna":3,"lol":114,"wouldn":2,"know":6,"lowkey":2,"man":5}}

kc根据复选框状态进行修改,但words保持不变。

我哪里错了?

3 个答案:

答案 0 :(得分:1)

Splice用于删除数组中的某些内容,它将两个整数作为参数。

由于你有一个对象,只需使用delete:

delete $scope.words[keyword];

通过这样做,$ scope.words = data.unsorted_arr,这两个变量引用同一个对象,所以从$ scope.words中删除一些内容会将其从data.unsorted_arr中删除。

保留对它的引用,以便您以后可以重新填充它:

var word = $scope.words[keyword];
...
delete $scope.words[keyword];
...
$scope.words[keyword] = word;

答案 1 :(得分:1)

在您的示例中,您定义了一个用于删除元素的函数,但该函数永远不会被调用。

var remove = function() { 
  $scope.words.splice(keyword, 1);     
}

您可能需要使用逻辑删除该功能(因为它似乎不需要)并将splice替换为delete语句:

$http.get('array.json').success(function(data) {
    var keyword = 'lol';
     $scope.words = data.unsorted_arr;
   $scope.$watch('hide', function () {
        if ($scope.hide == true) {
            delete $scope.words[keyword];
            $scope.kc = 'hidden';
        } else {
            $scope.kc = 'not hidden';
            $scope.words = data.unsorted_arr;
        }
    });

 });

答案 2 :(得分:1)

您将索引数组与关联数组混淆,

Array.splice是Indexed Arrays的方法, 你有一个简单的Javascript Object (associative array) ...

在POJO上你可以使用删除运算符或简单地重新分配到undefined:

&#13;
&#13;
var a  = { foo: 'baz' };

delete a['foo'];

var b = ['foo', 'baz'];

b.splice(0, 1)
&#13;
&#13;
&#13;