【问题标题】:indexOf in array returns -1 instead of index number数组中的 indexOf 返回 -1 而不是索引号
【发布时间】:2019-11-21 08:40:53
【问题描述】:

当我将 'orderOfPlanets' 传递给我的 each(){};函数,我希望得到行星的名称和相应的索引号,但是我每次都得到-1。为什么是这样?

var mostEvil = {
    Cthulhu: "Most evil",
    Dracula: "Fairly evil",
    Voldermort: "Pretty damn evil",
    Sauron: "Ridiculously evil"
};

var orderOfPlanets = ["Mercury", "Venus", "Earth", "Mars"];

function each(input, callback) {
    if (Array.isArray(input)) {
        for (var i = 0; i < orderOfPlanets.length; i++) {
            var name = orderOfPlanets[i];
            var val = orderOfPlanets.indexOf(i);
            callback(val, name);
        }
    } else if (typeof input == "object") {
        for (var key in input) {
            var name = key;
            var val = input[key];
            callback(val, name);
        }
    }
}

each(orderOfPlanets, function(val, name) {
    console.log("The value of " + name + " is " + val);
});

水星的值为0 金星的值为1 地球的价值是 2 火星值是3

【问题讨论】:

  • 您将索引传递给indexOf。这没有意义。
  • 你已经有i; indexOf 是多余的...
  • indexOf 在数组中查找元素并返回索引。因此,例如orderOfPlanets.indexOf('Venus') 将返回 1。您传递的是 i,它是索引,而不是名称。你到底想让它做什么?
  • 数组有一个内置的.forEach() 方法。而Object.keys()Obejct.values()Object.entries() 将一个对象转换为各种风格的数组。因此,如果您愿意,可以使用orderOfPlanets .forEach()Object.entries( mostEvil ).forEach()

标签: javascript arrays loops indexing indexof


【解决方案1】:

取名字not i(索引)的indexOf

var mostEvil = {
    Cthulhu: "Most evil",
    Dracula: "Fairly evil",
    Voldermort: "Pretty damn evil",
    Sauron: "Ridiculously evil"
};

var orderOfPlanets = ["Mercury", "Venus", "Earth", "Mars"];

function each(input, callback) {
    if (Array.isArray(input)) {
        for (var i = 0; i < orderOfPlanets.length; i++) {
            var name = orderOfPlanets[i];
            //var val = orderOfPlanets.indexOf(i);
            var val = orderOfPlanets.indexOf(name);
            callback(val, name);
        }
    } else if (typeof input == "object") {
        for (var key in input) {
            var name = key;
            var val = input[key];
            callback(val, name);
        }
    }
}

each(orderOfPlanets, function(val, name) {
    console.log("The value of " + name + " is " + val);
});

同样有效的是返回i

var mostEvil = {
    Cthulhu: "Most evil",
    Dracula: "Fairly evil",
    Voldermort: "Pretty damn evil",
    Sauron: "Ridiculously evil"
};

var orderOfPlanets = ["Mercury", "Venus", "Earth", "Mars"];

function each(input, callback) {
    if (Array.isArray(input)) {
        for (var i = 0; i < orderOfPlanets.length; i++) {
            var name = orderOfPlanets[i];
            //var val = orderOfPlanets.indexOf(i);
            var val = i;
            callback(val, name);
        }
    } else if (typeof input == "object") {
        for (var key in input) {
            var name = key;
            var val = input[key];
            callback(val, name);
        }
    }
}

each(orderOfPlanets, function(val, name) {
    console.log("The value of " + name + " is " + val);
});

【讨论】:

  • 是的,但var val = orderOfPlanets.indexOf(name); 只返回i,他已经拥有了。这完全是多余的。
  • 这个答案仍然是正确的;问题是“为什么 indexOf 总是返回 -1”,并演示了 indexOf(name) 的正确用法回答了这个问题。冗余是次要影响。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-17
  • 2021-05-23
  • 1970-01-01
  • 1970-01-01
  • 2018-11-12
  • 1970-01-01
相关资源
最近更新 更多