基于JS中的键将值附加到对象中的数组

时间:2013-11-01 06:42:53

标签: javascript arrays object

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

例如。

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

看起来像

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

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

例如,如果值为101,我想将其添加到键room1,以便以后可以轻松检索这些值。

这次整个对象变成了

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

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

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

我尝试了什么?

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

var arr = [];

每当值cam我将它推到数组

arr.push(value);

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

3 个答案:

答案 0 :(得分: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];
    }
}

答案 1 :(得分: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.");
      }
 }

答案 2 :(得分: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];
     }
 }

A working demo