0

我有一个对象,想根据键将值附加到其中的数组。

例如。

var A = {};
A[room1] = ["1"];
A[room2] = ["2"];
A[room3] = ["3"];

看起来像

A = {"room1":["1"], "room2":["2"], "room3":["3"]};

但我想要的是,每当用户给出与已添加的键相对应的值时,而不是覆盖我想要附加的先前值。

例如,如果 value 来了101,我想将它添加到 keyroom1中,以便以后可以轻松检索这些值。

所以这次整个对象变成了

A = {"room1":["1","101"], "room2":["2"], "room3":["3"]};

现在,如果我想添加201到 key room2,它将是:

A = {"room1":["1","101"], "room2":["2","201"], "room3":["3"]};

我尝试了什么?

我有一个数组。我不想使用很多数组。

var arr = [];

每当值凸轮我把它推到数组

arr.push(value);

但是将其推送到数组会导致将值添加到所有而不是相应的键

4

3 回答 3

4

[[此答案的第一部分基于 OP 问题的先前版本,该问题现已编辑为不同的问题。有关适用于问题当前编辑的解决方案,请参阅此答案的第二部分(当整个问题更改为其他内容时,它真的把事情搞砸了。]]

原始答案

您只需要测试密钥是否已经存在并检查那里是否已经存在数组。如果密钥不存在,请添加它。如果键存在并且它已经是一个数组,只需将另一个值推入数组即可。如果键存在,但不是数组,则获取该值,然后将键重置为包含前两个值的数组。

这是执行此操作的代码:

function addValue(obj, key, value) {
    if (obj.hasOwnProperty(key)) {
        // check if it's already an array using the recommended way of detecting an array
        if (Object.prototype.toString.call(obj[key]) === "[object Array]")
            obj[key].push(value);
        } else {
            var firstVal = obj[key];
            obj[key] = [firstVal, value];
        }
    } else {
        obj[key] = value;
    }
}

最新答案

仅供参考,您的数据结构选择很难读取和写入,因为读取器和写入器都必须先检查值的类型,然后才能对其进行操作。如果项目总是像这样在其中包含一个或多个元素的数组会容易得多。

// one item for each key
A = {"room1":["1"], "room2":["2"], "room3":["3"]};

// add 101 to room 1
A = {"room1":["1","101"], "room2:["2"], "room3":["3"]};

// add 201 to room 2
A = {"room1":["1","101"], "room2":["2","201"], "room3":["3"]};

然后,您将需要任何特殊的代码来读取和写入,您只需检查密钥是否存在,如果存在,则将新值推入其中。如果没有,请添加数组。

在这种情况下,添加一个值就是这样

function addValue(obj, key, value) {
    if (obj.hasOwnProperty(key)) {
        obj[key].push(value);
    } else {
        obj[key] = [value];
    }
}
于 2013-11-01T06:45:22.067 回答
1

尝试这个

 function pushValue(obj, key, value)
 {
      if(obj.hasOwnProperty(key) {
           var currentVal = obj[key];
           if(currentVal instanceof Array)
                obj[key].push(value);
           else
                obj[key] = [currentVal, value];
      } else {
           alert("No such key.");
      }
 }
于 2013-11-01T06:51:53.347 回答
1

您的要求也可以通过这种方式实现。

function pushValue(obj, key, value)
 {
     if(obj[key])
     {
       if(obj[key].push)
         {
            obj[key][obj[key].length] = value;
         }
       else
         {
            var xContainedVal = obj[key];
            obj[key] =[xContainedVal, value];
         }
     }
     else
     {
         alert("Key Not Found!");
     }
 }

更新:

function pushValue(obj, key, value)
 {
     if(obj[key])
     {
        obj[key][obj[key].length] = value;
     }
     else
     {
        obj[key] =[value];
     }
 }

一个工作演示

于 2013-11-01T07:10:15.937 回答