【问题标题】:What's an Associative Array?什么是关联数组?
【发布时间】:2019-10-08 00:10:21
【问题描述】:

我试图了解关联数组的真正含义以及获取它需要哪些步骤。我见过很多完全不同的解释。

我已经尝试过自己测试它,但最终似乎无法真正得到它。

var array = ["one", "two", "three"];
var test = array["one"];
console.log(test);

我希望它以字符串“one”所在的索引为目标,但发生错误。

【问题讨论】:

  • 如果您尝试使用字符串来获取特定属性,您的意思可能是Object,而不是Array
  • 这里有什么问题?您实际上是在寻找问题的定义或解决方案吗?为什么用splitquery-string标记?
  • 其实你应该这样调用数组:console.log(array[1]);如果你想要不同的行为,你可以这样做:array["one"] = "one"然后调用array["one"]console.log(array["one"]);

标签: javascript arrays split query-string


【解决方案1】:

您可能正在寻找一个 JavaScript 对象,它与其他语言中的关联数组、字典或映射基本相同:它将字符串映射到值。与 Arrays 使用方括号 [] 进行声明不同,对象使用花括号 {}请注意,有一些例外情况)。

尝试将Object 视为关联数组:

const arr = {one: 1, two: 2, three: 3};
console.log(arr['one']);
console.log(arr.one);

值得注意的是,JavaScript 中的Array 在技术上是对象。

JavaScript Array 对象是用于构造数组的全局对象;它们是高级的、类似列表的对象。

ArrayObject 之间的主要区别在于 Arrays 是数字索引的。

const arr = ['fooValue', 'barValue'];
const obj = {foo: 'fooValue', bar: 'barValue'};

console.log('arr: ', arr[0], arr[1]);
console.log('obj: ', obj.foo,  obj.bar);

值得注意的是,与 JavaScript 中的原始类型不同,Object's(和Array's,也是Object's)是通过引用传递的,因此在尝试复制对象。

function test(obj) {
  obj['oops'] = 'this will modify the object';
}

const obj = {one: 1, two: 2, three: 3};
test(obj);
console.log(obj); // Object was updated

为避免意外改变对象,您必须在对其执行操作之前创建对象的新实例。有多种方法可以做到这一点:

【讨论】:

    【解决方案2】:

    我试图了解关联数组到底是什么......

    JavaScript 没有关联数组,例如 PHP 就有。 JavaScript 有:

    • 数组,(有效)数字索引(请参阅 my blog post 了解我为什么说“有效”)
    • 对象,它们是具有名称的属性的集合,可以是字符串或符号(并且具有其他功能,例如继承)
    • 映射,它们是键/值对的集合,其中键可以是任何类型(不仅仅是字符串或符号)

    数组

    要在数组中查找条目的索引,通常您使用indexOf(用于=== 匹配)或findIndex,如果您想提供谓词函数。

    var array = ["one", "two", "three"];
    console.log(array.indexOf("one")); // 0

    对象

    如果您愿意,您可以创建一个将字符串映射到数字的对象:

    var obj = {"one": 1, "two": 2, "forty-two": 42};
    console.log(obj["forty-two"]); // 42

    地图

    同样,地图也可以做到这一点:

    var map = new Map([
        ["one", 1],
        ["two", 2],
        ["forty-two", 42]
    ]);
    console.log(map.get("forty-two")); // 42

    【讨论】:

      【解决方案3】:

      关联数组是一种数据结构,一种数据集合,其范围是将一个键列表关联到各个值(键:值)。

      您可以在 Wikipedia here 中阅读,这是关联数组的示例,例如:地图、字典等。

      关联数组的示例也是 PHP 索引数组,例如:

      $cars[0] = "Volvo"; 
      $cars[1] = "BMW";
      $cars[2] = "Toyota";
      

      【讨论】:

        【解决方案4】:

        这不是一个关联数组,它只是一个规则数组,里面填充了文本。

        一个关联数组的例子(你也可以使用像 Miroslav's answer 这样的对象语法):

        var stuff = [];
        stuff['one'] = "hello 1";
        stuff['two'] = "hello 2";
        

        【讨论】:

          【解决方案5】:

          Wikipedia

          当您可以通过键查找值时,它是一种数据结构。这通常在 JS 中使用 MapObject 实现。

          const data = new Map([
              ['foo', 'one'],
              ['bar', 'two']
          ]);
          
          console.log( data.get("bar") );

          我希望它以字符串“one”所在的索引为目标,但发生错误。

          您正试图通过值在数组中查找属性的索引。

          这与关联数组无关,通过indexOf 方法实现。

          var array = ["one", "two", "three"];
          var test = array.indexOf("one");
          console.log(test);

          【讨论】:

            【解决方案6】:

            关联数组,本质上是一个哈希图,或关联关系的数组。

            例如,如果我要为水果构建一个关联数组,让我们假设它的价格。

            const arr = {'apple': 1, 'orange': 2, 'pear': 3};
            
            console.log(Object.keys(arr));
            console.log(Object.values(arr));
            

            【讨论】:

              【解决方案7】:

              与其他语言不同,Javascript 中的数组不仅限于数字索引。它们也可以充当散列(即,将字符串作为键)。关联数组是将键设置为非数字值的数组。

              默认情况下,在您提供的示例中,将升序数值分配给数组的每个成员。 IE。

              var array = ["one", "two", "three"];
              

              等价于

              var array = [];
              array[0] = 'one';
              array[1] = 'two';
              array[2] = 'three';
              

              关联数组将是一个您分配不同值而不是数值的数组:

              var array = [];
              array['one'] = 'one';
              array['two'] = 'two';
              

              但是,这本身带来了一些警告,它被认为是不好的做法,并且阵列变得更难管理。在这种情况下,最好使用对象或Map

              【讨论】:

                【解决方案8】:

                关联数组用于在整个数组中关联某些内容。 您可以将其与查询字符串一起使用,例如:

                为了从提交的论坛中获取信息,您需要将用户数据放入关联数组中。

                您将从获取查询字符串开始,如下所示:

                var queryString = window.location.search;
                queryString = queryString.substring(1);
                

                我做 substring(1) 的原因是我们可以删除 '?'一开始。

                获得网站的查询字符串后,您需要一个循环来分隔接收到的数据值:

                while (queryString.indexOf("+") != -1)
                    queryString = queryString("+", " ");
                

                这会将字符串中的所有“+”符号替换为空格,从而使您获得没有“+”符号的值。例如,您将拥有“Name=John”。

                现在我们需要从字符串中拆分出'&'。 我们还需要为来自用户的数据准备一个数组。

                var array = queryString.split("&");
                var userData = [];
                

                然后,创建一个 for 循环,以针对提交的数据量并在将其存储到数组中时单独获取它:

                for (let x = 0; x < array.length; x++) 
                {
                    var equalSign = array[x].search("=");
                    var theKeyValue = array[x].substring(0, equal);
                    var userDataValue = array[x];
                    userDataValue = decodeURIComponent(userDataValue); //Puts symbols back
                    userData[theKeyValue] = userDataValue;
                }
                

                这只是一个后续使用关联数组的示例,希望对您有所帮助。 :)

                【讨论】:

                  猜你喜欢
                  • 2013-02-21
                  • 2011-10-14
                  • 2018-02-11
                  • 1970-01-01
                  • 2015-01-14
                  • 2015-01-31
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多