如何使用变量值作为键名在chrome扩展中使用chrome.storage?

the*_*axx 18 local-storage google-chrome-extension

我正在尝试使用chrome的本地存储/同步存储(chrome.storage)来扩展,以存储数据条目,用于许多不同的条目.我似乎无法弄清楚它的正确语法.我只想简单地将信息存储为字符串.我搜索过,找不到任何有用的东西.

这对我来说使用正常的localStorage技术是有用的:

    var imageName = "Red Cat 5";
    var myDescription = "A nice kitty";

    localStorage.setItem (imageName, myDescription);
    console.log(localStorage[imageName]);
Run Code Online (Sandbox Code Playgroud)

这有效,让我从现有变量设置密钥.我怎么能用chrome.storage.local.set来做呢?我一直在尝试这个没有任何成功:

    var imageName = "Red Cat 5";
    var myDescription = "A nice kitty";

    chrome.storage.local.set({imageName: myDescription}, function()
    {console.log('success?');});

    chrome.storage.local.set({imageName: myDescription}, function()
    {chrome.storage.local.get(imageName, function(r){console.log(r.imageName);});});
Run Code Online (Sandbox Code Playgroud)

任何帮助深表感谢.谢谢!

-----更新以下-----

感谢您对代码的解释.我希望它可以帮助其他任何人.这样做的信息似乎很少!你的回答帮助我想出了这个:

    var nameOne = "al";
    var nameTwo = "bob";
    var nameThree = "carl";
    var nameFour = "dan";

    var dataObj = {};

    dataObj[nameOne] = nameTwo;
    dataObj[nameThree] = nameFour;

    storage.set(dataObj);

    storage.get(dataObj, function(result)
    {
    console.log(result[nameOne]);
    console.log(result[nameThree]);
    });
Run Code Online (Sandbox Code Playgroud)

aps*_*ers 31

使用命名对象,而不是匿名对象,并使用方括号设置成员变量:

var dataObj = {};
dataObj[imageName] = myDescription;
chrome.storage.local.set(dataObj, function() { /*...*/ });
Run Code Online (Sandbox Code Playgroud)

它不是最优雅的代码,但它是唯一的方法.

在ES6中,稍微短一些的方法是使用具有动态属性名称的对象文字:

chrome.storage.local.set({
    [imageName]: myDescription
}, function() { /*...*/ });
Run Code Online (Sandbox Code Playgroud)

  • @rich对象文字只能有文字属性名称.在这里,我们需要一个*可变*命名的属性.假设你想要一个名为`bazzle`的字面命名属性; 你可以做`{bazzle:5}`或`o = {}; o ["bazzle"] = 5;`.但是,如果你*不知道*你想要的属性的名称(即它存储在一个变量中),你只能做第二种情况`o [stringWithPropertyName] = 5;`.对象文字无法将变量用作属性名称; 即,`{stringWithPropertyName:5}`将使用文字串至结肠的左侧. (3认同)
  • 出于兴趣,匿名对象不起作用有何不同? (2认同)