如何从这个数据结构中删除js数组中的数据?

时间:2012-01-30 16:50:09

标签: javascript arrays

我需要时间来比较在线和离线时间。如果离线时间比在线时间更多 - 这次我需要删除。当用户没有时间线时 - 我需要删除此用户。

我有这个问题:当经历时间和smažuj是:仍然有一个“未定义”的值 - [未定义,未定义]然后这个条件不能满足 -

if (user.connectionTimes.length === 0) {
        delete users[id];
    }

如何解决这个问题?

我使用以下代码:

     var users = [];

        users[0] = {
            userId: 1,
            connectionTimes:
                [
                    {onlineTime:30, offlineTime:70},
                    {onlineTime:50, offlineTime:75}
                ]
        };

        users[1] = {
            userId: 2,
            connectionTimes:
                [
                    {onlineTime:80, offlineTime:70}
                ]
        };

        users[2] = {
            userId: 3,
            connectionTimes: []
        };

        for( var i=0; i<users.length; i++) {
        for( var j=0; j<users[i].connectionTimes.length; j++) {
            if( users[i].connectionTimes[j].onlineTime < users[i].connectionTimes[j].offlineTime) {
     delete users[i].connectionTimes[j];           
    //EDIT - this work - users[i].connectionTimes.splice(j, 1);
    //j--;
            }
        }
        if( users[i].connectionTimes.length == 0) {
delete users[i];

            //EDIT - this work - users.splice(i, 1);
            //i--;
        }
    }

        console.log(users);

3 个答案:

答案 0 :(得分:4)

delete会在数组中留下一个洞。

要实际删除整个广告位,请致电array.splice(index, 1) 这会将所有后续插槽向下移动1以填补空洞。

你应该在向后循环中执行此操作,否则最终会跳过下一个项目。

答案 1 :(得分:2)

delete将从对象中删除属性,但在数组中,它只是将该索引中的值设置为undefined

var arr = [1, 2, 3];
delete arr[0];
//undefined, 2, 3

要删除数组条目,您可以使用splice。所以而不是:

delete users[id];

你会这样做:

users.splice(id, 1);

答案 2 :(得分:1)

删除不会删除索引,只会将值变为undefined。
你要找的是splice(),试试这个:

if (user.connectionTimes.length === 0) {
   users[id].splice(id, 1);
}