动态添加到对象并创建未定义?

时间:2015-12-15 16:11:47

标签: javascript object

我很难搜索/解释我正在尝试做的事情,但我想将数据添加到JavaScript对象中。我想要添加数据的索引可能存在也可能不存在,并且索引名称将是动态的,因此我不能只在开始时定义所有对象。

让我们说当用户点击我网站上的链接时,我正在添加一个对象。我已经定义了我的对象:

exampleObject.fruit = {};
exampleObject.fruit.strawberry = true;

如果用户点击水果链接,我想将水果添加到对象中。我通常会这样做:

if ( typeof exampleObject.fruit === 'undefined' ){
    exampleObject.fruit = {};
    exampleObject.fruit.cherry = true;
} else {
    exampleObject.fruit.cherry = true;
}

我的问题是,当用户点击下一个水果时,我不想覆盖该对象。我需要检查对象是否已定义,然后添加到它:

{{1}}

我想知道的是,如果有上述条件的简写方法吗?因为我会做很多事情,所以我希望能有一个单行程。我的下一个想法是为此创建一个函数,但我不想重新发明轮子或限制自己(如果我想在此对象中使用数组将所有水果推入一个索引)。在这种情况下,jQuery是一个选项,但不一定是我的第一选择。

3 个答案:

答案 0 :(得分:2)

exampleObject = exampleObject || {};
exampleObject.fruit = exampleObject.fruit || {};
exampleObject.fruit.cherry = true;

答案 1 :(得分:1)

基于您已经说过索引名称将是动态的事实,使用方括号来调整对象键/索引:

function addFruit (name) {

  exampleObject = exampleObject || {};
  exampleObject.fruit = exampleObject.fruit || {};

  if (typeof exampleObject.fruit[name] == 'undefined')
    exampleObject.fruit[name] = true;

}

答案 2 :(得分:1)

我会选择函数路径,具体取决于新索引的极端程度。这样您就可以一次性分配类别和项目。

"GET /v2/ HTTP/1.1" 404 466 "-" "docker/1.9.1 go/go1.4.2 git-commit/a34a1d5 kernel/3.13.0-24-generic os/linux arch/amd64"
172.28.144.202 - - [22/Dec/2015:11:06:00 -0500] "GET /v2/ HTTP/1.1" 404 466 "-" "docker/1.9.1 go/go1.4.2 git-commit/a34a1d5 kernel/3.13.0-24-generic os/linux arch/amd64"
 "GET /v1/_ping HTTP/1.1" 404 470 "-" "docker/1.9.1 go/go1.4.2 git-commit/a34a1d5 kernel/3.13.0-24-generic ] "PUT /v1/repositories/ubuntu/ HTTP/1.1" 403 449 "-" "docker/1.9.1 go/go1.4.2 git-commit/a34a1d5 kernel/3.13.0-24-generic os/linux arch/amd64"