【问题标题】:create an associative array from two regular arrays从两个常规数组创建一个关联数组
【发布时间】:2012-04-24 02:13:29
【问题描述】:

我想将两个常规数组绑定到一个关联数组中。 第一个的值是键,第二个的值是元素。

var array1=new Array("key1","Key2","Key3");
var array2=new Array("Value1","Value2","Value3");

var associative_array=new Array();
for(var i=0;i<3;i++){

associative_array[array1[i]]=array2[i];
}

但是当我尝试获取新关联数组的长度时,我注意到它是空的:

alert(associative_array.length);//always 0

请问哪里做错了?提前谢谢。

【问题讨论】:

标签: javascript associative-array


【解决方案1】:

在 Javascript 中,将对象用于关联数组。有很多方法可以重写它,但使用您的示例只需将“new Array()”替换为“new Object()”:

var array1=new Array("key1","Key2","Key3");
var array2=new Array("Value1","Value2","Value3");

var associative_array=new Object();
for(var i=0;i<3;i++){
  associative_array[array1[i]]=array2[i];
}

您需要实现一些东西来获取对象的大小。以下应该是函数或方法的一部分,但应该说明这个想法:

var o_size = 0;
for (key in associative_array) {
  o_size++;
}
alert(o_size);

【讨论】:

  • 您返回的对象的大小不正确,因为您没有检查hasOwnProperty。看我的回答。
  • 您可以在 for 循环中使用 i&lt;array1.lengthi&lt;array2.length 而不是 i&lt;3。希望当您使用它时,数组的长度相同(我想您不能假设数组的长度相同,但它们应该是相同的,因为您将它们转换为对象)
【解决方案2】:

我的做法:

function createAssociativeArray(arr1, arr2) {
    var arr = {};
    for(var i = 0, ii = arr1.length; i<ii; i++) {
        arr[arr1[i]] = arr2[i];
    }
    return arr;
}

var array1 = ["key1", "Key2", "Key3"];
var array2 = ["Value1", "Value2", "Value3"];
var associativeArray = createAssociativeArray(array1, array2);

这(与您的方法不同)将返回一个没有length 属性的对象,因为它的每个值都不被视为索引,而是一个属性。如果您迫切需要获取对象属性的长度,可以执行以下操作:

function getObjectPropertiesLength(obj) {
    var propNum = 0;
    for(prop in obj) {
        if(obj.hasOwnProperty(prop)) propNum++;
    }
    return propNum;
}

var values = getObjectPropertiesLength(associativeArray);

请注意,如果您向对象添加函数,这些函数将被视为对象的属性,因此会影响对象的属性长度。

你的方法做了什么:

您的方法失败的原因是您正在向 Array 对象添加属性。是的,从技术上讲,数组是 Javascript 中的对象,这意味着您可以为它们分配属性。但是,这并没有按照预期的方式使用数组,这可能会产生意想不到的结果。其中一个结果是length 值会突然失效。

这是因为 Array 对象希望它们的属性用数字索引。如果将属性分配给带有字符串的对象,则返回数组长度的函数实际上无法看到该属性,因此它不会影响数组的长度。

【讨论】:

  • 嗯,不,从技术上讲,他的方法将返回一个数组,确实有一个长度属性。不过,该长度始终为 0。
  • 哎呀,对,因为数组是对象,他可以为对象分配属性,但数组长度函数不会看到这些等等。我的错误。 =]
【解决方案3】:

在 JavaScript 中,关联数组只是一个对象。它没有长度属性。事实上,将 Array() 用作关联数组并不是一个好主意。您生成对象的代码在其他方面是可以的,除了可能将大小硬编码为 3。

【讨论】:

  • 你所说的“硬编码”是什么意思?我不熟悉这个词
  • @ajax333221:他的意思是它不是动态值,例如无论数组的内容是什么,它总是 3。不过,这真的无关紧要,因为这是一个简单的测试用例。
猜你喜欢
  • 1970-01-01
  • 2010-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-14
  • 2019-03-11
  • 1970-01-01
  • 2014-09-23
相关资源
最近更新 更多