【问题标题】:Populate a javascript array shorthand for keys like php为 php 之类的键填充 javascript 数组简写
【发布时间】:2012-10-24 12:34:02
【问题描述】:

在 Javascript 中,知道我可以设置一个数组,以便键是一个自动编号(从 0 开始)分配的数组:

var d_names = new Array("Sunday", "Monday", "Tuesday", 
              "Wednesday", "Thursday", "Friday", "Saturday");

// Key for Sunday is '0' 

如果我想分配键,我可以这样做:

    var d_names={};
    d_names[5]="Sunday";
    d_names[6]="Monday";
    d_names[7]="Tuesday";
    d_names[8]="Wednesday";
    d_names[9]="Thursday";
    d_names[10]="Friday";
    d_names[11]="Saturday";

    // Key for Sunday is '5'

但是有没有像 PHP 那样分配键的简写方式?

var d_names = new Array(5=>"Sunday", 6=>"Monday", 7=>"Tuesday", 8=>"Wednesday", 
            9=>"Thursday", 10=>"Friday", 11=>"Saturday"); 

// Doesn't work

【问题讨论】:

  • 为什么要从 5 开始索引?
  • Javascript 不支持关联数组。但是,您可以使用对象。尽管语法不同。
  • 致审阅建议编辑的人:如果它覆盖了以后编辑的更改,请不要按原样批准。

标签: javascript arrays shorthand array-key


【解决方案1】:

你想要的是一个对象:

var d_names = {
    5: "Sunday",
    6: "Monday"
    //...
};

然后你可以像这样得到"Sunday":

var sunday = d_names[5];

【讨论】:

  • Javascript 不支持关联数组...这是一个对象!
  • 没错,我正在更新我的答案。由于 JavaScript 对象可以使用作为关联数组,因此很容易犯错误。
  • 好的,我明白了!然后,answer=d_names[5](如果它是一个关联数组),在键 5 上获取 answer 的 javascript 等效语法是什么?
  • 语法相同。我正在更新我的答案。
  • 这里有一个小问题 - 它与数组不完全相同。例如,它没有长度属性,并且您不能将新值 push() 到末尾。如果您不需要这些(或其他)特定于数组的功能,那么这很好。
【解决方案2】:

在 PHP 中,具有手动定义键的数组(与以 0 开头的连续整数相反)称为“关联数组” - 这就是您在上面的示例中使用 '=>' 分隔键和值的内容。

在 Javascript 中,“关联数组”在技术上是一个“对象”(尽管 JS 中的所有内容都是一个对象 - 不过这是一个更详细的主题)。

JS 中“索引数组”(连续整数键)的简写是:

var d_names = [
  'Sunday',
  'Monday',
  // etc.
];

而 JS 中对象(如关联数组)的简写是:

var d_names = {
  5: 'Sunday',
  6: 'Monday',
  // etc.
};

但是,在 Javascript 中使用索引数组 -vs- 对象/关联时应该小心。 Javascript 不是 PHP,“一切都是对象”这一事实在循环时会产生影响。一个显着的区别是for(var i=0; i<arr.length; ++i){} 迭代数组keys 而for(var x in obj) {} 迭代对象“成员”,这可能因环境/浏览器/等而异。

【讨论】:

    【解决方案3】:

    不完全是,但你可以使用一个对象

    var obj = {
    
    5:"Sunday",
    6:"Monday",
    7:"Tuesday",
    8:"Wednesday",
    9:"Thursday",
    10:"Friday",
    11:"Saturday"    
    }
    

    如果要使用数组

    var arr = [];
    arr[4] = undefined;
    arr.push("Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday");
    

    【讨论】:

      【解决方案4】:

      你可以通过这个和其他一些技巧来实现这一点

       var d_names = [,,,,,"Sunday", "Monday", "Tuesday", 
                "Wednesday", "Thursday", "Friday", "Saturday"];
      
       alert(d_names[5]); //prints "Sunday"
      

      【讨论】:

      • 感谢您的回复。但这更像是“假设”;这些日子可能是水果或其他东西的名称。我使用的索引可能不是数字顺序。我刚刚对数组与对象的事情感到模糊,但其他一些答案也有帮助。
      【解决方案5】:

      php 中的以下内容:

      echo json_encode(new Array(5=>"Sunday", 6=>"Monday", 7=>"Tuesday",...11=>"Saturday")); 
      

      将生成看起来像这样的 JSON

         {"5":"Sunday","6":"Monday" , "7":"Tuesday"..."11":"Saturday"}
      

      如果通过 ajax 发送并且结果是 json 解析,它将返回一个对象:

       obj= { "5": "Sunday", "6": "Monday",....  "11": "Saturday"}
      

      现在您可以使用 javascript 对象表示法进行访问:

       alert( obj['5'] )/* SUnday*/
      

      【讨论】:

      • 您的第二个代码块看起来不正确。您已经输入了一个带有字符串值的关联数组,但它返回了一个带有对象(带有字符串值)的索引数组。
      • 啊,抱歉。对您的编辑的另一条评论(我认为您以前对此是正确的)- JSON 比 Javascript“更严格”,因为它不允许整数键-因此 PHP 将输出用双引号括起来的键。不过,这纯粹是针对 JSON 的,因此与 OP 有点无关,但提及它并没有什么坏处 - 它在过去让我大吃一惊。
      • 真的吗?你可能认为我有什么新东西……/去研究。
      • @lucideer 数字作为值是有效的。我从不使用数字键
      【解决方案6】:

      JavaScript 中有no associative arrays。你有两个选择:

      一个简单的对象,用作(未排序!)键值映射 - 易于编写为文字,也是 JSON 语法:

      {
          "5": "Sunday",
          "6": "Monday",
          "7": "Tuesday",
          "8": "Wednesday",
          "9": "Thursday",
          "10": "Friday",
          "11": "Saturday"    
      }
      

      或者您可以使用稀疏的Array,即没有属性 0 到 4 的值。您可以通过以下方式轻松创建它

      var arr = new Array(5); // creates an empty array object with length 5
      arr.push("Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday");
      

      相当于字面量

      [,,,,, "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]
      

      【讨论】:

      • 关于尝试在 Javascript 中使用关联数组的危险的非常好的链接。
      猜你喜欢
      • 1970-01-01
      • 2014-02-18
      • 2011-01-22
      • 2017-06-06
      • 2023-04-03
      • 1970-01-01
      • 2018-09-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多