我有你可以称之为父数组的主数组。在页面加载时,包含有关站点上每个用户的信息的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" ... }
。
有谁知道为什么会这样?很抱歉这个很长的帖子可能是一个非常简单的修复...!
答案 0 :(得分:4)
重复使用:
display_users = all_users.slice();
答案 1 :(得分:2)
你的问题就在这里
display_users = all_users;
它不是复制数组,而是创建另一个对同一数组的引用。如果您希望复制数组,可以使用Array.slice()代替
var display_users = all_users.slice(0);