在遍历对象时获取 for...of 循环中的迭代次数 JavaScript

Get iteration number in for...of loop while iterating over an object JavaScript

我从 API 调用中得到以下对象:

{
    "email": ["The email has already been taken."],
    "profile_image": [ "profile image is requried." ]
}

我使用以下代码迭代此对象(使用 for...of)

let message = "";
for (const [error_name, error_value, i] of Object.entries(
  error.response.data.errors
)) {
  message += `${i}: ${error_value[0]}\n`;
}

但我得到的是 undefined 而不是 i 的值。我想得到迭代次数.

有什么建议吗?

一个Object.entries项将只包含两个值:键和值。如果您也想要索引,则必须自己实施或使用其他策略。一种选择是使用 forEach 来遍历数组(第二个参数 forEach 采用的是当前索引):

let message = "";
Object.entries(error.response.data.errors)
  .forEach(([error_name, error_value], i) => {
    message += `${i}: ${error_value[0]}\n`;
  });

您还可以通过使用 .map/.join:

来避免 messagelet
const message = Object.entries(error.response.data.errors)
  .map(([error_name, error_value], i) => `${i}: ${error_value[0]}`)
  .join('\n');

(与您的原始代码不同,末尾没有尾随换行符,但这可能是件好事)

来自 Object.entries 的迭代器仅生成 [key, value] 形式的两位数组。这些数组中没有第三个条目。

一般来说,对象应该被认为是无序的,所以不清楚为什么需要索引。但是如果你这样做了,因为你正在构建一个带有连接的字符串,你可以在 Object.entries 数组上使用 map 代替:

let message =
    Object.entries(error.response.data.errors)
    .map(([error_name, error_value], i) => `${i}: ${error_value[0]}\n`)
    .join("");

实例:

const error = {
    response: {
        data: {
            errors: {
              "email": ["The email has already been taken."],
              "profile_image": [ "profile image is requried." ]
            }
        }
    }
};
let message =
    Object.entries(error.response.data.errors)
    .map(([error_name, error_value], i) => `${i}: ${error_value[0]}\n`)
    .join("");
console.log(message);