循环是否没有获得正确的数组位置,为什么?

时间:2018-06-19 14:36:48

标签: javascript

我正在学习JavaScript,遇到以下情况:

我的代码:

alfabetoMadegues = "jngmclqskrzfvbwpxdht"

var listaLetras = Array.from(alfabetoMadegues);

dicionario_Madegues = {};

for (var i = 0 < listaLetras.length; i++;) {
    listaLetras.forEach(element => {

        dicionario_Madegues[element] = i;
    })
};

如果“ j”是数组的第一个元素,那么“ j”为什么接收2而不是0?为什么我得到这个结果?

预期结果应该是:

"j" 0
"n" 1
"g" 2
"m" 3
"c" 4
"l" 5

5 个答案:

答案 0 :(得分:6)

ES6解决方案 又名ECMA2015 -see compatibility table


作为Array.forEach的第二个参数,您可以获取元素的位置;例如:

const alfabetoMadegues = 'jngmclqskrzfvbwpxdht';

const listaLetras = Array.from(alfabetoMadegues);

const dicionario_Madegues = {};

listaLetras.forEach((x, xi) => {
  dicionario_Madegues[x] = xi;
});

console.log(dicionario_Madegues);


此外,使用Array.reduce更合适;例如

PS::我们使用了Spread运算符...和动态键名[x]

const alfabetoMadegues = 'jngmclqskrzfvbwpxdht';

const listaLetras = Array.from(alfabetoMadegues);

const dicionario_Madegues = listaLetras.reduce((tmp, x, xi) => ({
  ...tmp,
  
  [x]: xi,
}), {});

console.log(dicionario_Madegues);



ES5解决方案


var alfabetoMadegues = 'jngmclqskrzfvbwpxdht';

var listaLetras = Array.from(alfabetoMadegues);

var dicionario_Madegues = {};

for (var i = 0; i < listaLetras.length; i += 1) {
  dicionario_Madegues[listaLetras[i]] = i;
}

console.log(dicionario_Madegues);

答案 1 :(得分:4)

您不希望forEach内的for。对于您描述的输出,您只想删除它并用dicionario_Madegues[listaLetras[i]] = i;代替。

您的for循环中也有一个错误。你有:

for (var i = 0 < listaLetras.length; i++;) {

...它将永远运行。初始化和测试应使用;分开:

for (var i = 0; i < listaLetras.length; i++) {
// -----------^^^--------------------------^ (no `;` after `i++`)

实时示例:

var alfabetoMadegues = "jngmclqskrzfvbwpxdht";

var listaLetras = Array.from(alfabetoMadegues);

var dicionario_Madegues = {};

for (var i = 0; i < listaLetras.length; i++) {
    dicionario_Madegues[listaLetras[i]] = i;
}

console.log(dicionario_Madegues);

还要注意我移去并添加了;的各个地方。可能值得为他们复习规则。

答案 2 :(得分:0)

您循环了两次:

for (var i = 0 < listaLetras.length; i++;) { // HERE
    listaLetras.forEach(element => { //HERE
        dicionario_Madegues[element] = i;
    })
};

因此,您必须使用forforEach

alfabetoMadegues = "jngmclqskrzfvbwpxdht"

var listaLetras = Array.from(alfabetoMadegues);

var dicionario_Madegues_CON_FOR = {};
var dicionario_Madegues_CON_FOREACH = {};

for (var i = 0 ; i < listaLetras.length ; i++ ) {
  dicionario_Madegues_CON_FOR[listaLetras[i]] = i;
};

listaLetras.forEach((letra, indice) => dicionario_Madegues_CON_FOREACH[letra] = indice);

console.log(dicionario_Madegues_CON_FOR);
console.log(dicionario_Madegues_CON_FOREACH);

您的for中也存在sintax错误:

for (var i = 0 < listaLetras.length; i++;)

应该是

for(var i = 0 ; i < listaLetras.length ; i++ )

答案 3 :(得分:0)

除了提供的答案外,您还可以考虑以下方法:

alfabetoMadegues = "jngmclqskrzfvbwpxdht"

var obj = {}

alfabetoMadegues.split('').forEach((element, index) => obj[element] = index)

console.log(obj)

答案 4 :(得分:0)

此行有误

for (var i = 0 < listaLetras.length; i++;) {

for构造包含三个部分:

  • 初始化
  • 条件
  • 事后

每个部分都用;分隔。

您已经伪装了条件(i < listaLetras.length)并进行了初始化。事后的想法留空了。

正确的代码应该是

for (var i = 0; i < listaLetras.length; i++) {

j为2的原因有两个;

在循环的第一遍,我将设置i < listaLetras.length的值-该值为true。

接下来,循环将运行比较(以检查是否应运行循环的主体)。这里的比较是.... i++!我是对的,所以比较通过了,然后我增加了。

i的值 true 隐式转换为1。

当我们点击循环的主体时,现在是2。

您还将使用foreach函数循环两次-将发生的i的每个迭代将每个值设置为i。