How to create dictionary and add key–value pairs dynamically?

后端 未结 15 672
没有蜡笔的小新
没有蜡笔的小新 2020-11-28 00:37

From post:

Sending a JSON array to be received as a Dictionary

I’m trying to do this same thing as that post. The only issue is that I d

相关标签:
15条回答
  • 2020-11-28 01:11
    var dict = []; // create an empty array
    
    dict.push({
        key:   "keyName",
        value: "the value"
    });
    // repeat this last part as needed to add more key/value pairs
    

    Basically, you're creating an object literal with 2 properties (called key and value) and inserting it (using push()) into the array.


    Edit: So almost 5 years later, this answer is getting downvotes because it's not creating an "normal" JS object literal (aka map, aka hash, aka dictionary).
    It is however creating the structure that OP asked for (and which is illustrated in the other question linked to), which is an array of object literals, each with key and value properties. Don't ask me why that structure was required, but it's the one that was asked for.

    But, but, if what you want in a plain JS object - and not the structure OP asked for - see tcll's answer, though the bracket notation is a bit cumbersome if you just have simple keys that are valid JS names. You can just do this:

    // object literal with properties
    var dict = {
      key1: "value1",
      key2: "value2"
      // etc.
    };
    

    Or use regular dot-notation to set properties after creating an object:

    // empty object literal with properties added afterward
    var dict = {};
    dict.key1 = "value1";
    dict.key2 = "value2";
    // etc.
    

    You do want the bracket notation if you've got keys that have spaces in them, special characters, or things like that. E.g:

    var dict = {};
    
    // this obviously won't work
    dict.some invalid key (for multiple reasons) = "value1";
    
    // but this will
    dict["some invalid key (for multiple reasons)"] = "value1";
    

    You also want bracket notation if your keys are dynamic:

    dict[firstName + " " + lastName] = "some value";
    

    Note that keys (property names) are always strings, and non-string values will be coerced to a string when used as a key. E.g. a Date object gets converted to its string representation:

    dict[new Date] = "today's value";
    
    console.log(dict);
    // => {
    //      "Sat Nov 04 2016 16:15:31 GMT-0700 (PDT)": "today's value"
    //    }
    

    Note however that this doesn't necessarily "just work", as many objects will have a string representation like "[object Object]" which doesn't make for a non-unique key. So be wary of something like:

    var objA = { a: 23 },
        objB = { b: 42 };
    
    dict[objA] = "value for objA";
    dict[objB] = "value for objB";
    
    console.log(dict);
    // => { "[object Object]": "value for objB" }
    

    Despite objA and objB being completely different and unique elements, they both have the same basic string representation: "[object Object]".

    The reason Date doesn't behave like this is that the Date prototype has a custom toString method which overrides the default string representation. And you can do the same:

    // a simple constructor with a toString prototypal method
    function Foo() {
      this.myRandomNumber = Math.random() * 1000 | 0;
    }
    
    Foo.prototype.toString = function () {
      return "Foo instance #" + this.myRandomNumber;
    };
    
    dict[new Foo] = "some value";
    
    console.log(dict);
    // => {
    //      "Foo instance #712": "some value"
    //    }
    

    (Note that since the above uses a random number, name collisions can still occur very easily. It's just to illustrate an implementation of toString.)

    So when trying to use objects as keys, JS will use the object's own toString implementation, if any, or use the default string representation.

    0 讨论(0)
  • 2020-11-28 01:11

    First Initialise Array Globally

    var dict = []
    

    Add Object into Dictionary

    dict.push(
         { key: "One",value: false},
         { key: "Two",value: false},
         { key: "Three",value: false});
    
    Output : 
       [0: {key: "One", value: false}
        1: {key: "Two", value: false}
        2: {key: "Three", value: false}]
    

    Update Object from Dictionary

    Object.keys(dict).map((index) => {        
      if (index == 1){
        dict[index].value = true
      }
    });
    
    Output : 
       [0: {key: "One", value: false},
        1: {key: "Two", value: true},
        2: {key: "Three", value: false}]
    

    Delete Object from Dictionary

    Object.keys(dict).map((index) => {              
          if (index == 2){
            dict.splice(index)
          }
        });
    
    Output : 
        [0: {key: "One", value: false},
         1: {key: "Two", value: true}]
    
    0 讨论(0)
  • 2020-11-28 01:12
    var dict = {};
    
    dict['key'] = "testing";
    
    console.log(dict);
    

    works just like python :)

    console output:

    Object {key: "testing"} 
    
    0 讨论(0)
  • 2020-11-28 01:14

    Its as simple as:

    var blah = {}; // make a new dictionary (empty)
    

    or

    var blah = {key: value, key2: value2}; // make a new dictionary with two pairs 
    

    then

    blah.key3 = value3; // add a new key/value pair
    blah.key2; // returns value2
    blah['key2']; // also returns value2
    
    0 讨论(0)
  • 2020-11-28 01:16

    I ran into this problem.. but within a for loop. The top solution did not work (when using variables (and not strings) for the parameters of the push function), and the others did not account for key values based on variables. I was surprised this approach (which is common in php) worked..

      // example dict/json                  
      var iterateDict = {'record_identifier': {'content':'Some content','title':'Title of my Record'},
        'record_identifier_2': {'content':'Some  different content','title':'Title of my another Record'} };
    
      var array = [];
    
      // key to reduce the 'record' to
      var reduceKey = 'title';
    
      for(key in iterateDict)
       // ultra-safe variable checking...
       if(iterateDict[key] !== undefined && iterateDict[key][reduceKey] !== undefined)
        // build element to new array key
         array[key]=iterateDict[key][reduceKey];
    
    0 讨论(0)
  • 2020-11-28 01:19

    Since you've stated that you want a dictionary object (and not an array like I assume some understood) I think this is what you are after:

    var input = [{key:"key1", value:"value1"},{key:"key2", value:"value2"}];
    
    var result = {};
    
    for(var i = 0; i < input.length; i++)
    {
        result[input[i].key] = input[i].value;
    }
    
    console.log(result); // Just for testing
    
    0 讨论(0)
提交回复
热议问题