如何在不使用jQuery的情况下从json数组中删除项?

时间:2013-04-12 04:09:53

标签: javascript

我有以下数组:

$scope.myData = [
                 {id: 1, age: 50},
                 {id: 2, age: 43},
                 {id: 8, age: 27},
                 {id: 9, age: 29}
                ];

如果给出行id值,我想要删除一行。我知道我可以使用类似的东西:

$scope.myData.splice(0,1);

但是,如果我给出的话,我如何确定行号:

var idToRemove = 8;

这是我给出的使用jQuery的解决方案。不幸的是我不使用jQuery所以我正在寻找一个javascript解决方案。

    function remove(array, property, value) {
        $.each(array, function(index, result) {
            if (result[property] == value) {
                array.splice(index, 1);
            }
        });    
    };

2 个答案:

答案 0 :(得分:2)

这是一种有效的方式,向后循环(如果您定位的相同属性不止一次匹配):

function remove(array, property, value) {
    var i, j, cur;
    for (i = array.length - 1; i >= 0; i--) {
        cur = array[i];
        if (cur[property] === value) {
            array.splice(i, 1);
        }
    }
}

DEMO: http://jsfiddle.net/RbfTt/2/

这与while循环相同:

function remove(array, property, value) {
    var i = array.length,
        j, cur;
    while (i--) {
        cur = array[i];
        if (cur[property] === value) {
            array.splice(i, 1);
        }
    }
}

DEMO: http://jsfiddle.net/RbfTt/3/

当可以匹配多个项目时,需要向后循环,因为.splice()将更改阵列并弄乱循环。

如果多个项目不匹配,那么正常的递增for循环将起作用,但您可能需要放入break;以确保它不会继续循环。

答案 1 :(得分:0)

我的版本..

function remove(property, num, arr) {
    for (var i in arr) {
        if (arr[i][property] == num)
            arr.splice(i, 1);
    }
}

用法:

remove('id', 8, myData);