复制阵列上的拼接将从父/主阵列中删除对象

时间:2015-02-15 01:02:26

标签: javascript jquery arrays

我有你可以称之为父数组的主数组。在页面加载时,包含有关站点上每个用户的信息的json_encoded PHP数组被分配给JS变量 - var all_users = <?php echo $users;?>;。此数组的console.log看起来像这样......

[Object, Object, Object, Object, Object, Object, Object, Object, Object]
    0: Object
         user_id: "4"
         registered: "2015-02-15 12:54:34"
         ...etc
    1: Object
         user_id: "5"
         ...etc

在外部.js文件中,我有一些用于各种过滤选项的事件处理程序。目前,这些过滤器通过向服务器发送AJAX请求,查询数据库,然后返回数据来工作。这很好,但是每次查询数据库都没有必要(只有大约50条记录)因此改变了我对JS数组的方法。

因此,我的解决方案是首先将all_users的内容复制到新变量display_users,每次调用下面的函数时(以便重置display_users以包含所有内容)用户)。这个新变量的目的是能够删除任何与用户过滤器不匹配的记录。例如,搜索user_id = 4会导致第二个,第三个,第四个......对象从display_users中移除,只留下匹配的对象。

var display_users = [];

function update_users (type) {
    display_users = all_users;
    i = 0;

    $.each(all_users, function() {
        var user = this;
        $.each(user, function(k, v) {
            // show_admin_only is true or false
            if (show_admin_only) {
                // if the key is_admin has a value of 0 they are not an admin, remove them from the display users array
                if (k == 'is_admin' && v == 0) display_users.splice(i,1);
            }               
        });
        i++;
    });

    // pass the array through to a jQuery template
}

然而,问题是接头导致错误。第一次运行此功能非常棒,但Chrome第二次报告两个警告'window.webkitStorageInfo' is deprecated. Please use 'navigator.webkitTemporaryStorage' or 'navigator.webkitPersistentStorage' instead.'webkitIndexedDB' is deprecated. Please use 'indexedDB' instead.。在出现这些错误之后,该函数的任何未来运行都会导致从两个数组,主数据和副本中删除记录。

鉴于此,我猜测display_users充当指向主阵列的指针all_users,但那对我来说没有多大意义,而且是为什么我现在完全失败了。 console.log输出后的两个数组中的i = 0 ...

Run 1
[Object, Object, Object, Object, Object, Object, Object, Object, Object]
[Object, Object, Object, Object, Object, Object, Object, Object, Object]

Run 2
[Object, Object, Object, Object, Object, Object, Object, Object]
[Object, Object, Object, Object, Object, Object, Object, Object]

// for every run, -1 Object from BOTH arrays

我在console.log(user);中添加了$.each(user, function(k, v) {,并且在这些第二,第三,......运行期间,它开始输出数百个Window {top: Window, window: Window, location: Location, external: Object, chrome: Object…}以及预期的那些,例如Object {user_id: "4", registered_date: "2015-02-15 12:54:34" ... }

有谁知道为什么会这样?很抱歉这个很长的帖子可能是一个非常简单的修复...!

2 个答案:

答案 0 :(得分:4)

重复使用:

display_users = all_users.slice();

答案 1 :(得分:2)

你的问题就在这里

 display_users = all_users;

它不是复制数组,而是创建另一个对同一数组的引用。如果您希望复制数组,可以使用Array.slice()代替

 var display_users = all_users.slice(0);