admin管理员组

文章数量:1401484

I have an object and want to append values to arrays inside it based on key.

For eg.

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

which will be looking like

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

But what I want is that whenever a user gives some value corresponding to the already added key, instead of overwriting the previous value I want to append in it.

If, for example, value came as 101 and I want to add it to key room1 in such a way that later these values can be retrieved easily.

So the whole object this time bees

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

Now if I want to add 201 to key room2 , it will be:

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

What I have I tried?

I have an array. I don't want to use many arrays.

var arr = [];

whenever value cam I push it to the array

arr.push(value);

But pushing it to the array leads to adding values to all not to the corresponding key

I have an object and want to append values to arrays inside it based on key.

For eg.

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

which will be looking like

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

But what I want is that whenever a user gives some value corresponding to the already added key, instead of overwriting the previous value I want to append in it.

If, for example, value came as 101 and I want to add it to key room1 in such a way that later these values can be retrieved easily.

So the whole object this time bees

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

Now if I want to add 201 to key room2 , it will be:

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

What I have I tried?

I have an array. I don't want to use many arrays.

var arr = [];

whenever value cam I push it to the array

arr.push(value);

But pushing it to the array leads to adding values to all not to the corresponding key

Share Improve this question edited Nov 1, 2013 at 7:00 softvar asked Nov 1, 2013 at 6:42 softvarsoftvar 18.5k13 gold badges57 silver badges77 bronze badges 3
  • 2 And what have you tried to solve the problem? Where exactly are you stuck? Do you know how arrays work? – Felix Kling Commented Nov 1, 2013 at 6:44
  • yes I know, I'm adding values to array using .push() but the point is valuesshould be added to respective key – softvar Commented Nov 1, 2013 at 6:47
  • FYI, this is a nuisance data structure to work with. Any reader will have to check the type of the data before being able to use it. Why not just make every element an array with one or more elements in it? – jfriend00 Commented Nov 1, 2013 at 6:55
Add a ment  | 

3 Answers 3

Reset to default 4

[[The first part of this answer is based on a previous version of the OP's question which has now been edited to a different problem. See the second part of this answer for the solution which applies to the current edit of the question (It really messes things up when the whole question gets changed to something else.]]

Original Answer

You just have to test if the key already exists and examine if there's already an array there. If the key doesn't exist, add it. If the key exists and it's already an array, just push another value into the array. If the key exists, but it's not an array, grab the value and then reset the key to an array with the first two values in it.

Here's code to do that:

function addValue(obj, key, value) {
    if (obj.hasOwnProperty(key)) {
        // check if it's already an array using the remended 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;
    }
}

Latest Answer

FYI, your data structure choice is difficult to both read and write because both reader and writer have to check the type of a value before they can operate on it. It would be much easier if items were just always arrays with one or more elements in them like this.

// 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"]};

Then, you would need any special code to read and to write, you'd just check if the key exists and if so, push a new value into it. If not, add the array.

In this case, adding a value would just be this

function addValue(obj, key, value) {
    if (obj.hasOwnProperty(key)) {
        obj[key].push(value);
    } else {
        obj[key] = [value];
    }
}

try this

 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.");
      }
 }

Your requirement can be achieved in this way too.

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!");
     }
 }

Updated:

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

A working demo

本文标签: javascriptappend values to array inside object based on key in JSStack Overflow