【问题标题】:How do I use a string value to access an array in javascript?如何使用字符串值访问 javascript 中的数组?
【发布时间】:2012-03-11 22:28:37
【问题描述】:

这已经困扰了我很长一段时间了。我要做的就是从给定键的数组中返回一个值,但使用变量 (_interview) 来选择要返回的数组。

var utils = function () {

var _language = "";
var _interview = "";
var _base = "";

var _alerts = function (code) {

    var en = new Array(),
        fr = new Array();

    en[0] = "You must enter a value in the box before continuing.";
    fr[0] = "Vous devez entrer une sélection pour les options mises en évidence.";

    // I know _interview is returning the correct value of either "en" or "fr"
    // I have tried this[_interview][code] but I get property not defined at the index
    // How do I return the index from the right array?
};

return {

    lang : function () {

        _language = $("#language option:selected").val();
        var answer = confirm(_alerts(0)); // Call from here

    }
};
}();

$(document).ready(function ()
{
    utils.lang();
});

【问题讨论】:

    标签: javascript


    【解决方案1】:

    最好使用二维数组(深度对象结构),字符串作为键而不是整数索引

    var languages = {
        'en': {
            'string_key_1' : 'String For Key 1'
        },
        'fr': {
            'string_key_1' : 'Le String ...'
        }
    };
    

    获取类似的值

    var key = 'string_key_1';
    var translated_value = languages[_interview][key];
    

    【讨论】:

      【解决方案2】:

      您可以使用方括号访问对象属性的值,如下所示:

      var index = 'foo',
          myObj = {
            foo: 'bar'
          };
      
      alert(myObj[index]); // 'bar'
      

      数组也是如此,但只有数字键有效:

      var index = 1,
          myArr = ['foo','bar'];
      
      alert(myArr[index]); // 'bar'
      

      【讨论】:

      • 不仅仅是数字键,数组只是具有特殊 length 属性的对象。您可以像其他对象一样添加和读取属性,但它们当然要与用作索引的数字属性名称一起使用。
      【解决方案3】:

      Bracket notation 是正确的做法。但是,您需要将语言放入一个数组中,因为 this 并不像您想象的那样引用函数范围。在这种特殊情况下,this === window 这显然不是您想要的!

      试一试:

      var utils = function() {
      
          var _language = "";
          var _interview = "";
          var _base = "";
      
          var _alerts = function(code) {
      
              var messages = {
                  en: ["You must enter a value in the box before continuing."],
                  fr: ["Vous devez entrer une sélection pour les options mises en évidence."]
              };
      
              // I know _interview is returning the correct value of either "en" or "fr"
              // I have tried this[_interview][code] but I get property not defined at the index
              // How do I return the index from the right array?
              return messages[_language][code];
          };
      
          return {
      
              lang: function() {
      
                  _language = $("#language").val(); // note the selector change
                  var answer = confirm(_alerts(0)); // Call from here
              }
          };
      }();
      
      $(document).ready(function() {
          utils.lang();
      });​
      

      工作演示:english|french

      【讨论】:

      • 如果我添加更多消息,这仍然有效吗?添加更多时出现未定义的错误。
      • 为每种语言添加更多消息,还是添加新语言?无论哪种方式,它都应该工作。如何编辑其中一个 jsFiddles 以显示您正在尝试的内容?
      【解决方案4】:

      查看 eval() 函数。这应该可以帮助您完成所需的工作。

      【讨论】:

      • eval is, in general, evil and unnecessary. 有更好的解决方案。建议某人使用 eval 可能特别有害,因为他们可能不一定了解全部含义。
      • 那么有什么替代解决方案,因为现在我想知道。
      猜你喜欢
      • 2021-03-31
      • 2023-04-08
      • 1970-01-01
      • 2015-10-30
      • 2019-10-18
      • 1970-01-01
      • 2021-12-20
      • 1970-01-01
      • 2011-05-02
      相关资源
      最近更新 更多