【问题标题】:jQuery extend overwrites part of arrayjQuery扩展覆盖数组的一部分
【发布时间】:2013-07-02 13:04:27
【问题描述】:

我正在创建一个 Google Chrome 用户脚本,它将存储用户选择忽略的用户名。所有被忽略的用户都将使用 HTML5 Local Storage API 存储在本地。

我正在使用 jQuery 帮助将用户添加到 JSON 数组,然后将其存储在本地。 我的问题是它总是覆盖第一项。

如果我添加“testuser1”,然后尝试添加“testuser2”,它将存储“testuser2”的详细信息,“testuser1”将消失。

// Get users from localstorage
var ignored_users = JSON.parse(localStorage.getItem("ignore_list"));

// If NULL, prepare as JSON
if(ignored_users === null)
{
    var ignored_users = {};
}

// Prep
var username = get_username_profile();
desc = prompt("Why do you want to ignore this user?");

// Add to list
add_to_list = [{
    "username" : username,
    "description" : desc
}];
$.extend(ignored_users, add_to_list);
localStorage["ignore_list"] = JSON.stringify(ignored_users);

// Highlight as ignored
$(".user_wrapper").css("background-color","#B40404");

【问题讨论】:

  • ignord_users 最初的样子是什么?
  • [{ "username" : "test_user1", "desc" : false }];
  • 你为什么不直接做ignore_users.push()?

标签: jquery arrays html local-storage extend


【解决方案1】:

$.extend 用于对象。将它与数组一起使用是没有意义的。要“扩展”数组,请使用 .concat。不过,在您的情况下,使用.push 可能更有意义——您不需要将正在创建的对象包装在数组中。

【讨论】:

    【解决方案2】:

    ignored_users 是一个包含数组的对象(您应该将其设为数组,除非您想在对象中存储额外信息),您正在覆盖它,因此您的行为是预期的,您应该做的是检索数组,然后push 将额外的对象放到它上面:

    var ignored_users = JSON.parse(localStorage.getItem('ignore_list'));
    if (!ignored_users) {
        ignored_users = [];
    }
    
    var username = get_username_profile();
    desc = prompt("Why do you want to ignore this user?");
    
    var add_to_list = {
        "username" : username,
        "description" : desc
    };
    
    ignored_users.push(add_to_list);
    localStorage['ignore_list'] = JSON.stringify(ignored_users);
    

    PS:没有检查重复的忽略用户,你应该这样做:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-07-21
      • 2016-06-19
      • 1970-01-01
      • 2012-07-23
      • 2015-08-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多