在我看来,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"));
我知道这远非完美,这只是第一次尝试看看它是否有效。我只是想知道为什么我找不到任何类似的解决方案。
此方法是否已弃用?如果是,最好的选择是什么?
我的最低要求是:
- 按键访问元素(检索/更改值)
- 维护元素顺序
- 按键和值对元素进行排序
数组不提供键
但据我所知,没有简单的方法可以通过键访问元素 在这种方法中(不必遍历所有元素)
如果正确解释问题,则可以分配字母或其他"键"作为索引标识符,并使用数字标识符访问数组中的相同元素
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]];
})