【问题标题】:Javascript: Associative arrays by altering Array.prototype - deprecated? [closed]Javascript:通过更改 Array.prototype 的关联数组 - 已弃用? [关闭]
【发布时间】:2016-03-03 11:46: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. 按键和值对元素进行排序

【问题讨论】:

  • 看看 ES6 映射:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…。更改原生原型被认为是不好的做法。
  • 有一些库可以解决这些问题,尤其是在使用原型时,无需重新发明轮子
  • @am2124429 “数组不提供密钥” 是什么意思?您想使用字母访问数组的元素吗?例如,arr[a]?
  • 不幸的是,以最佳实践为中心的问题并不适合 Stack Overflow,因为它们主要会产生基于意见的答案(“我喜欢这样做......”,“人们通常使用这个...... 。”)。虽然您可能会根据作者认为的“最佳实践”看到其他问题的答案,但专门询问它们是题外话。有关详细信息,请参阅help center
  • @GeoPhoenix:这将是一个很大的帮助。可以举个例子吗?

标签: javascript arrays sorting hash


【解决方案1】:

数组不提供键

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

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

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])

【讨论】:

【解决方案2】:

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

它没有被弃用,但它不是一个好主意,因此是一个不好的编码实践,主要原因如下

  • 这些额外的属性不包含在 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]];

})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-01
    • 1970-01-01
    • 2021-11-27
    • 2016-02-04
    • 1970-01-01
    • 2020-03-21
    • 1970-01-01
    • 2021-12-30
    相关资源
    最近更新 更多