diff --git a/lib/rules/no-array-index-key.js b/lib/rules/no-array-index-key.js
index ceb2a1676a..d75988a833 100644
--- a/lib/rules/no-array-index-key.js
+++ b/lib/rules/no-array-index-key.js
@@ -150,6 +150,40 @@ module.exports = {
identifiers.filter(isArrayIndex).forEach(() => {
context.report({node, message: ERROR_MESSAGE});
});
+
+ return;
+ }
+
+ if (node.type === 'CallExpression'
+ && node.callee
+ && node.callee.type === 'MemberExpression'
+ && node.callee.object
+ && isArrayIndex(node.callee.object)
+ && node.callee.property
+ && node.callee.property.type === 'Identifier'
+ && node.callee.property.name === 'toString'
+ ) {
+ // key={bar.toString()}
+ context.report({
+ node,
+ message: ERROR_MESSAGE
+ });
+ return;
+ }
+
+ if (node.type === 'CallExpression'
+ && node.callee
+ && node.callee.type === 'Identifier'
+ && node.callee.name === 'String'
+ && Array.isArray(node.arguments)
+ && node.arguments.length > 0
+ && isArrayIndex(node.arguments[0])
+ ) {
+ // key={String(bar)}
+ context.report({
+ node: node.arguments[0],
+ message: ERROR_MESSAGE
+ });
}
}
diff --git a/tests/lib/rules/no-array-index-key.js b/tests/lib/rules/no-array-index-key.js
index ec4370298c..7f8b691e41 100644
--- a/tests/lib/rules/no-array-index-key.js
+++ b/tests/lib/rules/no-array-index-key.js
@@ -75,6 +75,22 @@ ruleTester.run('no-array-index-key', rule, {
code: 'foo.map((baz, i) => )'
},
+ {
+ code: 'foo.map((bar, i) => )'
+ },
+
+ {
+ code: 'foo.map((bar, i) => )'
+ },
+
+ {
+ code: 'foo.map((bar, i) => )'
+ },
+
+ {
+ code: 'foo.map((bar, i) => )'
+ },
+
{
code: 'foo.reduce((a, b) => a.concat(), [])'
},
@@ -119,6 +135,16 @@ ruleTester.run('no-array-index-key', rule, {
errors: [{message: 'Do not use Array index in keys'}]
},
+ {
+ code: 'foo.map((bar, i) => )',
+ errors: [{message: 'Do not use Array index in keys'}]
+ },
+
+ {
+ code: 'foo.map((bar, i) => )',
+ errors: [{message: 'Do not use Array index in keys'}]
+ },
+
{
code: 'foo.map((bar, anything) => )',
errors: [{message: 'Do not use Array index in keys'}]