如何在数组 (Javascript) 中对多个布尔值使用 indexOf 方法?

How do I use indexOf method with multiple Boolean values in an array (Javascript)?

我是 javascript 的新手,我在使用数组中的 indexOf() 方法获取多个布尔值的位置时遇到了问题。我见过类似的 post "indexOf method with multiple values" 但它似乎只适用于字符串:

let arr = ["true", "true", "false", "false", "false", "false", "false", "true"];
let newArr = [];

for (let i = 0; i < arr.length; i++) {
  if (arr[i].indexOf("true") >= 0) {
    newArr.push(i);
  }
}
console.log(newArr) // result: (3) [0, 1, 7]

但是,我的代码如下所示,在数组中使用布尔值:

let arr = [true, true, false, false, false, false, false, true];
let newArr = [];

for (let i = 0; i < arr.length; i++) {
  if (arr[i].indexOf(true) >= 0) {
    newArr.push(i);
  }
}
console.log(newArr) // result: Uncaught TypeError: arr[i].indexOf is not a function

我怎样才能得到与数组中的字符串值相同的结果(位置:[0, 1, 7)?我确实尝试使用 join() 方法,如 ('"' + arr.join('","') + '"') 将布尔值转换为字符串。它只是看起来一样,但现在是一个字符串值,因此,它仍然不起作用。请帮助我的 Javascript 旅程。感谢您的帮助!

嗯,你可以减少它。第三个参数是当前索引 i

let arr = [true, true, false, false, false, false, false, true];

let result = arr.reduce((a,v,i) => {
   if(v === true) a.push(i);
   return a;
},[])

console.log(result);

或者forEach它还有一个索引参数

let arr = [true, true, false, false, false, false, false, false];
let newArr = [];

arr.forEach((el, i) => {
   if(el === true) newArr.push(i);
})

console.log(newArr);

IndexOf returns 可以在数组中找到给定元素的第一个索引,如果不存在则为 -1,这意味着您只会找到第一个索引 (0)。

let arr = [true, true, false, false, false, false, false, false];
let newArr = [];

for (let i = 0; i < arr.length; i++) {
    if (arr[i]) {
        newArr.push(i);
    }
}

console.log(newArr);

基本上indexOf就是ArrayString类型的方法。所以当你做的是布尔值时,它不会起作用

Array.prototype.indexOf()

String.prototype.indexOf()

因此,在您的情况下,只需将值转换为 String

let arr = [true, true, false, false, false, false, false, false]
let newArr = []

for (let i = 0; i < arr.length; i++) {
  if (String(arr[i]).indexOf(true) >= 0) {
    newArr.push(i)
  }
}
console.log(newArr)

无需担心将传递给 indexOf 参数的值转换为字符串,因为此方法会为您转换该值

String.prototype.indexOf() > 语法 > 参数

ECMAScript Language Specification

当您在第一个代码块中引用 arr[i] 时,您引用的是索引 i 处的字符串值。这意味着当您这样做时:

if (arr[i].indexOf("true") >= 0) {

...您正在 arr[i] 上执行 .indexOf(),它是 "true""false"(不是您的数组)。当您对字符串执行 indexOf() 时,它将为您提供传入字符串出现位置的第一个索引。在 "true" 的情况下,如果 arr[i] 为“true”,那么您将获得索引 0,因为字符串 true 从索引 0 开始。在 arr[i] 的情况下"false" 那么 .indexOf() 将 return -1 因为 "true" 没有出现在你的字符串中。如您所见,您的 .index() 只是检查 "true" 是否出现在您的字符串数组值之一中。但是,由于您的数组值仅由“true”或“false”组成,因此无需在第一个示例中使用 .indexOf(),而是您可以检查数组中的当前项是否等于 "true" 如果是,则将当前索引推送到您的数组。

对于第二个示例,您的值是布尔值。这意味着 arr[i] 现在是布尔值 truefalse。布尔值 not 有一个 .indexOf() 方法,因此你会收到错误。但是,如上所述,您不需要使用 .indexOf() 检查 arr[i] 是否为 true,而是只需要检查 arr[i] 是否为 true 如果是,则 .push() 当前索引如下所示:

let arr = [true, true, false, false, false, false, false, true];
let newArr = [];

for (let i = 0; i < arr.length; i++) {
  if (arr[i]) { // roughly the same as if(arr[i] == true)
    newArr.push(i);
  }
}
console.log(newArr);