如何在Javascript中获取关联数组和常规数组之间的区别?

时间:2012-07-09 00:19:40

标签: javascript arrays loops associative-array

是否有可能在Javascript中获得关联数组和常规数组的区别?

实施例

array1 = [5, 1, 3];
array2 = [1 => 15, 2 => 20, 3 => 10, 4 => 5, 5 =>50 ];

区别在于......

diff = [2 => 20, 4=> 5];

4 个答案:

答案 0 :(得分:4)

我认为你的问题只是在你的array2声明中有一个小错字。这不是什么大问题。

无论如何,这里有点黑客,但它会给你你想要的东西:

array1 = [5, 1, 3];
array2 = {1: 15, 2: 20, 3: 10, 4: 5, 5: 50};

var result = {};
for (var i in array2) {
    if (array1.indexOf(+i) < 0) {
        result[i] = array2[i];
    }
}

alert(JSON.stringify(result));

Working example

我的hack是+i调用中的indexOf,因为“关联数组”的属性是字符串,但您的array1包含数字。一元+从字符串中生成一个数字。有点hackish但它是惯用的JavaScript练习。

<强>附录

正如RobG所指出的,indexOf是一种ES5方法,因此如果您的JavaScript引擎是ES3或更低版本,则需要自行实施indexOfAn example of how to do this is at MDN。或者,您可以通过自己搜索数组来执行等效的indexOf

答案 1 :(得分:3)

首先,你的第二个数组应该是一个对象,并且不是有效的JavaScript,正如前两个评论者所说的那样。这是对象形式:

var object = { "1": 15, "2": 20, "3": 10, "4": 5, "5": 50 };

此功能可达到您想要的效果:

function findDiff(arr, obj)
{
    var tempObj = clone(obj);
    for (var i = 0; i < arr.length; i++)
    {
        var propId = arr[i];
        if (tempObj[propId] !== undefined)
            delete tempObj[propId];
    }
    return tempObj;
}

此函数依赖于名为clone的函数,该函数确保obj按值而不是引用复制到tempObj。这可以防止传递的对象被修改:

function clone(obj){
    if(obj == null || typeof(obj) != 'object')
        return obj;

    var temp = obj.constructor(); // changed

    for(var key in obj)
        temp[key] = clone(obj[key]);
    return temp;
}

就这样称呼它:

var array = [5, 1, 3];
var object = { "1": 15, "2": 20, "3": 10, "4": 5, "5": 50 };

var diff = findDiff(array, object);

答案 2 :(得分:2)

您需要详细说明您对操作结果的期望。

一种解释是根据另一个数组中的值从一个数组中删除成员,因此给出:

array1 = [5, 1, 3];
array2 = [15, 20, 10, 5, 50 ];

你可能有一个功能:

function diff(arr1, arr2) {
  // Copy arrays so don't affect originals
  var t1 = arr1.slice();
  var t2 = arr2.slice();

  // sort t1
  t1.sort();

  // Remove members of arr2 from highest indexes to lowest
  var i = t1.length;
  while (i--) {
    t2.splice(t1[i], 1);
  }
  return t2;
} 

 alert(diff(array1, array2));  // 15, 10, 50

请注意,数组是零索引的,并且array2中没有第5个成员,因此删除的值为20和5(即分别为索引1和3的成员)。

答案 3 :(得分:0)

另一种选择是,对变量执行JSON.stringify()并检查结果字符串的最左边或最右边的字符。如果是{},则您有一个关联数组/对象,如果是[],则它是一个数组。我认为这可能有点贵,取决于阵列的大小,但它可以完成这项工作。

然而...... 因为没有免费午餐这样的东西,并且所有的动物成对出现,这只是一个合理的解决方案,如果你因此根据原来使用了你的变量定义。
如果您定义了一个对象,如下所示:obj = [1,2,3]然后,稍后添加obj['w'] = 'ww'之类的值,JSON.stringify(obj)只生成{{} 1}},但是如果你再次发表[1,2,3],你仍会得到obj['w'],这意味着价值不会被遗忘,它们只是不混合。在内部,我想,javascript保留两个单独的变量表,一个用于对象,一个用于数组,以及先定义的那个,在使用stringify打印时获得点头。

如果你把变量首先定义为对象,然后添加一个数组键,又名

ww

新密钥自动转换为字符串,从而在

字符串化中产生结果
obj = {1: 11, 2: 22, 3: 33};
obj[4] = 44;

令人困惑,但我想这是你为一点无政府状态和易用性付出的代价。