JavaScript中以字母作为键的关联数组

5

我希望创建一个JavaScript对象(关联数组),其中字母是键。最好的方法是什么?

例如 -

obj[a] = 'somevalue'
obj[b] = 'somevalue' 
...
obj[z]= 'some value'

动态地将字母作为键值分配。


3
您的问题是什么?您尝试了什么? - Martin Hennings
Martin - 在 PHP 中,可以使用 range 函数轻松实现,例如 range('a','z'),我想知道在 JavaScript 中是否有类似的聪明方法。谢谢。 - thinking_hydrogen
7个回答

13

以下是一种快速而简单的创建对象的方法:

var a = 97;
var charArray = {};
for (var i = 0; i<26; i++)
    charArray[String.fromCharCode(a + i)] = String.fromCharCode(a + i);

console.log(charArray);

http://jsfiddle.net/V2B7S/


我需要将它转换为PHP,所以我进行了转换。但是我遇到了在PHP中不存在的 fromCharCode。因此,您可以使用在https://dev59.com/9mHVa4cB1Zd3GeqPsPox#9878531上回答的自定义函数来实现,并且效果非常好。 - RaphaelDDL
这太棒了。 - rpivovar

4
var hash = {};
hash["abcdefghijklmnopqrstuvwxyz"] = "something";
hash["בגדהוזחטיךכלםמןנסעףפץצקרשת"] = "something else";
hash["АБВГДЕЖЅZЗИІКЛМНОПРСТȢѸФХѾЦЧШЩЪꙐЬѢꙖѤЮѦѪѨѬѠѺѮѰѲѴ"] = "something else";

1
谢谢安德鲁。我正在寻找这样的东西 - obj[a] = 'somevalue',obj[b] = 'somevalue'等等,直到obj[z] = 'some value'。 - thinking_hydrogen
2
你确实要求“字母表”:P - Andrew Bullock

4
var obj = { };
obj['A'] = 'letter A';
obj['B'] = 'letter B';
obj['C'] = 'letter C';

或者:

var obj = [ ];
obj['A'] = 'letter A';
obj['B'] = 'letter B';
obj['C'] = 'letter C';

接着:

alert(obj.B);

或者等价的表达方式:
alert(obj['B']);

当涉及到非整数索引时,我建议使用 { } 语法。为什么呢?因为使用 [ ] 与非整数索引会有一些问题,例如:

var obj = [ ];
obj['A'] = 'letter A';
obj['B'] = 'letter B';
obj['C'] = 'letter C';
alert(obj.length);

猜一下会打印什么?是的,你猜对了:0。


谢谢您非常快速的回复,Darin。我知道可以这样做,但想知道是否有更好的方法来实现这一点。在PHP中,可以使用range函数轻松完成,例如range('a','z')。 - thinking_hydrogen
1
在 JavaScript 中,你可以使用数组([])或对象({}),需要知道的是数组实际上是一个带有一些陷阱的对象。因此要小心。使用数组来处理基于整数的索引,使用对象来处理非整数基础索引。 - Darin Dimitrov
首选的风格是使用[]表示数组,使用{}表示对象,而不是调用new Object()new Array()。构造函数在某些参数组合下会以意想不到的方式运作。(这些方式已经被记录并且可靠,但每次看到这种结构时,你都必须问自己“他们想做什么?”) - Sean McMillan
同意。我已经更新了我的答案,使用了首选的语法。 - Darin Dimitrov
感谢您的输入。我正在寻找类似于Thack_Mai和Jake的解决方案。 - thinking_hydrogen

2

你可以使用reduce创建关联数组:

const dict = Array.from(new Array(26))
    .reduce((p, c, i) => (p[String.fromCharCode(i + 97)] = i, p), {})

console.log(dict)


2

首先使用Thack Mai的技巧创建一个字母数组,具体方法请参考此链接

var associateArray = []  
for (i = 65; i <= 90; i++) {
    associateArray[i-65] = String.fromCharCode(i).toLowerCase()
}

然后将值映射到您想要映射值的任何字母。
associateArray['a'] = 1
associateArray['b'] = 2

这将创建浏览器中用于CSSStyleDeclaration的对象类型。可以像这样迭代它:
for (var i = 0; i < associateArray.length; i++) {
    console.log(associateArray[associateArray[i]])
}

请解释魔数65和90的含义(例如通过const声明或类似方式)。 - Peter Mortensen

1
function range( start, limit ){
    var assoc_array = {};
    var step = 1;
    var DEFAULT_VALUE = "some value";
    step *= limit.charCodeAt(0) - start.charCodeAt(0) > 0 ? 1:-1;
    while( start !== limit ){
        assoc_array[ start ] = DEFAULT_VALUE;
        start = String.fromCharCode(start.charCodeAt(0)+step);
    }
    assoc_array[ limit ] = DEFAULT_VALUE;
    return assoc_array;
}
//Usage examples
var alphabet_array = range('a','z');
var reverse_alphabet_array = range('z','a');

演示


0

console.group("Alphabets form (A-Z) are:");
var a = 65;
for (var i = 0; i<26; i++) { 
    console.log(String.fromCharCode(a + i))
}
console.groupEnd();

console.group("Alphabets form (a-z) are:");
var a = 97;
for (var i = 0; i<26; i++) { 
    console.log(String.fromCharCode(a + i))
}
console.groupEnd();


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接