【问题标题】:Best way to store a key=>value array in JavaScript?在 JavaScript 中存储 key=>value 数组的最佳方法?
【发布时间】:2010-11-11 19:06:43
【问题描述】:

在 javascript 中存储 key=>value 数组的最佳方法是什么,如何循环?

每个元素的key应该是一个标签,比如{id}或者只是id,value应该是id的数值。

它应该是现有 javascript 类的元素,或者是可以通过该类轻松引用的全局变量。

可以使用jQuery。

【问题讨论】:

  • 用 $.each 迭代的哈希不行吗?这几乎是标准的。
  • 为什么要使用 jQuery 来完成这个简单的基本任务,kgiannakakis?
  • 如果你仍然使用 jQuery 迭代 $.each 比简单的 for 循环更好。
  • @kgiannakakis 非常简单的推理,但对每个人来说都不是那么明显,因为它可以在这里看到。 ;-)
  • @kgiannakakis 或者,您可以使用 JavaScript 的内置 Array.prototype.forEach,而不是使用 jQuery 来遍历数组

标签: javascript jquery


【解决方案1】:

如果我理解正确的话:

var hash = {};
hash['bob'] = 123;
hash['joe'] = 456;

var sum = 0;
for (var name in hash) {
    sum += hash[name];
}
alert(sum); // 579

【讨论】:

    【解决方案2】:

    这就是 JavaScript 对象:

    var myArray = {id1: 100, id2: 200, "tag with spaces": 300};
    myArray.id3 = 400;
    myArray["id4"] = 500;
    

    您可以使用for..in loop 循环遍历它:

    for (var key in myArray) {
      console.log("key " + key + " has value " + myArray[key]);
    }
    

    另请参阅:Working with objects (MDN)。

    在 ECMAScript6 中也有 Map(参见那里的浏览器兼容性表):

    • 一个对象有一个原型,所以映射中有默认键。从 ES5 开始,这可以通过使用 map = Object.create(null) 绕过,但很少这样做。

    • 对象的键是字符串和符号,它们可以是 Map 的任何值。

    • 您可以轻松获取地图的大小,而您必须手动跟踪对象的大小。

    【讨论】:

    • 如果你的浏览器支持它(IE9及以上),更安全的是先用var foo = Object.create(null)创建空对象,然后像foo.bar = "baz"一样向它添加属性。用{}创建对象等价于Object.create(Object.prototype),也就是说它继承了Object的所有属性。通常这不是问题,但如果某些库修改了全局 Object.prototype,它可能会导致您的对象具有意外的键。
    • @RoryO'Kane 你可以使用 hasownproperty 来解决这个问题。
    • @DaMaxContent 左转三下也可以右转。
    • @thenaglecode 有时留下 3 次有效。想象一下,如果你不能右转?或者你必须不止一次这样做?
    • 但也许 OP 想要一个数组,因为对象不会在浏览器实现中保持项目的顺序一致?
    【解决方案3】:

    在 javascript 中,键值数组存储为对象。 javascript中有数组之类的东西,但它们在某种程度上仍然被认为是对象,请查看这些人的答案-Why can I add named properties to an array as if it were an object?

    数组通常使用方括号语法,对象(“key=>value”数组)使用大括号语法,但您可以使用方括号语法访问和设置对象属性,如 Alexey Romanov 所示。

    javascript 中的数组通常仅与数字、自动递增的键一起使用,但 javascript 对象也可以保存命名的键值对、函数甚至其他对象。

    简单的数组,例如

    $(document).ready(function(){
    
        var countries = ['Canada','Us','France','Italy'];
        console.log('I am from '+countries[0]);
        $.each(countries, function(key, value) {
            console.log(key, value);
        });
    
    });
    

    输出 -

    0“加拿大”

    1“我们”

    2“法国”

    3“意大利”

    我们在上面看到,我们可以使用 jQuery.each 函数循环一个数字数组,并使用带有数字键的方括号访问循环之外的信息。

    简单对象(json)

    $(document).ready(function(){
    
        var person = {
            name: "James",
            occupation: "programmer",
            height: {
                feet: 6,
                inches: 1
            },
        }
    
        console.log("My name is "+person.name+" and I am a "+person.height.feet+" ft "+person.height.inches+" "+person.occupation);
    
        $.each(person, function(key, value) {
            console.log(key, value);
        });
    
    });
    

    输出 -

    我的名字是詹姆斯,我是一名 6 英尺 1 的程序员

    詹姆斯的名字

    职业程序员

    高度对象{英尺:6,英寸:1}

    在像 php 这样的语言中,这将被视为具有键值对的多维数组,或数组中的数组。我假设是因为您询问了如何遍历键值数组,您想知道如何获取像上面的人对象这样的对象(键=> 值数组),比如说,不止一个人。

    好吧,既然我们知道 javascript 数组通常用于数字索引,而对象更灵活地用于关联索引,我们将一起使用它们来创建一个我们可以循环遍历的对象数组,就像这样 -

    JSON 数组(对象数组)-

    $(document).ready(function(){
    
        var people = [
            {
                name: "James",
                occupation: "programmer",
                height: {
                    feet: 6,
                    inches: 1
                }
            }, {
                name: "Peter",
                occupation: "designer",
                height: {
                    feet: 4,
                    inches: 10
                }
            }, {
                name: "Joshua",
                occupation: "CEO",
                height: {
                    feet: 5,
                    inches: 11
                }
            }
        ];
    
        console.log("My name is "+people[2].name+" and I am a "+people[2].height.feet+" ft "+people[2].height.inches+" "+people[2].occupation+"\n");
    
        $.each(people, function(key, person) {
            console.log("My name is "+person.name+" and I am a "+person.height.feet+" ft "+person.height.inches+" "+person.occupation+"\n");
        });
    
    });
    

    输出 -

    我的名字是 Joshua,我是 5 ft 11 的 CEO

    我的名字是詹姆斯,我是一名 6 英尺 1 的程序员

    我的名字是彼得,我是一名 4 英尺 10 英寸的设计师

    我的名字是 Joshua,我是 5 ft 11 的 CEO

    请注意,在循环外,我必须使用方括号语法和数字键,因为现在这是一个数字索引的对象数组,当然在循环内,数字键是隐含的。

    【讨论】:

    • 很好的解释帮助我解决了我正在建造一些东西来捕捉高度的问题。
    【解决方案4】:

    我知道它已经晚了,但它可能对那些想要其他方式的人有所帮助。另一种存储数组 key=>values 的方法是使用名为 map() 的数组方法; (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map) 你也可以使用箭头功能

     
        var countries = ['Canada','Us','France','Italy'];  
    // Arrow Function
    countries.map((value, key) => key+ ' : ' + value );
    // Anonomous Function
    countries.map(function(value, key){
    return key + " : " + value;
    });

    【讨论】:

      【解决方案5】:

      您可以使用Map

      • JavaScript ES6 中引入的新数据结构。
      • JavaScript 对象的替代方案,用于存储键/值对。
      • 有用于迭代键/值对的有用方法。
      var map = new Map();
      map.set('name', 'John');
      map.set('id', 11);
      
      // Get the full content of the Map
      console.log(map); // Map { 'name' => 'John', 'id' => 11 }
      

      使用 key 获取 Map 的值

      console.log(map.get('name')); // John 
      console.log(map.get('id')); // 11
      

      获取地图大小

      console.log(map.size); // 2
      

      检查键是否存在于地图中

      console.log(map.has('name')); // true
      console.log(map.has('age')); // false
      

      获取密钥

      console.log(map.keys()); // MapIterator { 'name', 'id' }
      

      获取值

      console.log(map.values()); // MapIterator { 'John', 11 }
      

      获取地图元素

      for (let element of map) {
        console.log(element);
      }
      
      // Output:
      // [ 'name', 'John' ]
      // [ 'id', 11 ]
      

      打印键值对

      for (let [key, value] of map) {
        console.log(key + " - " + value);
      }
      
      // Output: 
      // name - John
      // id - 11
      

      只打印地图的键

      for (let key of map.keys()) {
        console.log(key);
      }
      
      // Output:
      // name
      // id
      

      仅打印地图的值

      for (let value of map.values()) {
        console.log(value);
      }
      
      // Output:
      // John
      // 11
      

      【讨论】:

      • 好像和JSON.stringify()不兼容。
      • @kenorb 这是 ES6,使用 JSON.stringify([...map]);
      【解决方案6】:

      只需这样做

      var key = "keyOne";
      var obj = {};
      obj[key] = someValue;
      

      【讨论】:

      • 这对我有帮助。一个简单的调整,在我的 HTML 中的
      【解决方案7】:

      数组中的对象:

      var cars = [
              { "id": 1, brand: "Ferrari" }
              , { "id": 2, brand: "Lotus" }
              , { "id": 3, brand: "Lamborghini" }
          ];
      

      【讨论】:

        猜你喜欢
        • 2019-01-30
        • 2021-06-19
        • 2012-03-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多