Javascript:通过更改 Array.prototype 的关联数组 - 已弃用

Javascript: Associative arrays by altering Array.prototype - deprecated?

本文关键字:数组 关联 prototype Array Javascript      更新时间:2023-09-26

在我看来,javascript的一大缺点是没有关联数组。对象不提供顺序,数组不提供键。

数组也有可能包含对象:

[{key1:value1}, {key2:value2}]

但据我所知,在这种方法中,没有简单的方法可以通过键访问元素(而无需遍历所有元素)。

这就是为什么我开始考虑以下方法,即通过添加元素映射器使数组具有关联性:

Array.prototype.addKeyToLastElement = function(key) {
    if (!this.elementMapper) this.elementMapper = {};
    this.elementMapper[key] = this.length-1;
}
Array.prototype.getElementByKey = function(key) {
    if (this.elementMapper && this.elementMapper[key] !== undefined) {
        return this[this.elementMapper[key]];
    }
    else {
        return undefined;
    }
}
var test = [];
test.push(1);
test.addKeyToLastElement('a');
test.push(3);
test.addKeyToLastElement('b');
// get element by key
console.log(test.getElementByKey("a"));

我知道这远非完美,这只是第一次尝试看看它是否有效。我只是想知道为什么我找不到任何类似的解决方案。

此方法是否已弃用?如果是,最好的选择是什么?

我的最低要求是:

  1. 按键访问元素(检索/更改值)
  2. 维护元素顺序
  3. 按键和值对元素进行排序

数组不提供键

但据我所知,没有简单的方法可以通过键访问元素 在这种方法中(不必遍历所有元素)

如果正确解释问题,则可以分配字母或其他"键"作为索引标识符,并使用数字标识符访问数组中的相同元素

var alphabet = "abcdefghijklmnopqrstuvwxyz";
var arr = [];
for (var i = 0; i < alphabet.length; i++) {
  arr[alphabet[i]] = arr[i] = alphabet[i]
};
console.log(arr["a"], arr[0], arr["z"], arr[25])

此方法是否已弃用?如果是,最好的选择是什么?

它没有被弃用,但它不是一个好主意,因此由于以下主要原因,这是一种糟糕的编码实践

  • 这些额外的属性不包括在 JSON 序列化中。
  • 如果您执行像 arr = arr.slice(1) 这样的数组操作,这些属性将被丢弃,这会导致意外行为。

但是您仍然可以像这样对对象进行排序(在您的问题中)

[{key1:value1}, {key2:value2}]

通过做

var arr = [{key1:value1}, {key2:value2}];
arr.sort(function(a,b){
    return a[Object.keys(a)[0]] - b[Object.keys(b)[0]];
})