Skip to content

Commit d80362f

Browse files
committed
Expand no-array-index-key to other array iterator methods
Although some of these cover pretty unusual use-cases, they are easy enough to support and are unlikely to have false positives.
1 parent 4ef2810 commit d80362f

File tree

3 files changed

+122
-1
lines changed

3 files changed

+122
-1
lines changed

docs/rules/no-array-index-key.md

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,26 @@ The following patterns are considered warnings:
1414
things.map((thing, index) => (
1515
<Hello key={index} />
1616
));
17+
18+
things.forEach((thing, index) => {
19+
otherThings.push(<Hello key={index} />);
20+
});
21+
22+
things.filter((thing, index) => {
23+
otherThings.push(<Hello key={index} />);
24+
});
25+
26+
things.some((thing, index) => {
27+
otherThings.push(<Hello key={index} />);
28+
});
29+
30+
things.every((thing, index) => {
31+
otherThings.push(<Hello key={index} />);
32+
});
33+
34+
things.findIndex((thing, index) => {
35+
otherThings.push(<Hello key={index} />);
36+
});
1737
```
1838

1939
The following patterns are not considered warnings:
@@ -22,4 +42,24 @@ The following patterns are not considered warnings:
2242
things.map((thing) => (
2343
<Hello key={thing.id} />
2444
));
45+
46+
things.forEach((thing) => {
47+
otherThings.push(<Hello key={thing.id} />);
48+
});
49+
50+
things.filter((thing) => {
51+
otherThings.push(<Hello key={thing.id} />);
52+
});
53+
54+
things.some((thing) => {
55+
otherThings.push(<Hello key={thing.id} />);
56+
});
57+
58+
things.every((thing) => {
59+
otherThings.push(<Hello key={thing.id} />);
60+
});
61+
62+
things.findIndex((thing) => {
63+
otherThings.push(<Hello key={thing.id} />);
64+
});
2565
```

lib/rules/no-array-index-key.js

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,15 @@ module.exports = {
2424
// Public
2525
// --------------------------------------------------------------------------
2626
var indexParamNames = [];
27+
var iteratorFunctionNames = [
28+
'every',
29+
'filter',
30+
'find',
31+
'findIndex',
32+
'forEach',
33+
'map',
34+
'some'
35+
];
2736
var ERROR_MESSAGE = 'Do not use Array index in keys';
2837

2938
function isArrayIndex(node) {
@@ -39,7 +48,7 @@ module.exports = {
3948
if (callee.property.type !== 'Identifier') {
4049
return null;
4150
}
42-
if (callee.property.name !== 'map') {
51+
if (iteratorFunctionNames.indexOf(callee.property.name) === -1) {
4352
return null;
4453
}
4554

tests/lib/rules/no-array-index-key.js

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,42 @@ ruleTester.run('no-array-index-key', rule, {
9393
parserOptions: parserOptions
9494
},
9595

96+
{
97+
code: 'foo.forEach((bar, i) => { baz.push(<Foo key={i} />); })',
98+
errors: [{message: 'Do not use Array index in keys'}],
99+
parserOptions: parserOptions
100+
},
101+
102+
{
103+
code: 'foo.filter((bar, i) => { baz.push(<Foo key={i} />); })',
104+
errors: [{message: 'Do not use Array index in keys'}],
105+
parserOptions: parserOptions
106+
},
107+
108+
{
109+
code: 'foo.some((bar, i) => { baz.push(<Foo key={i} />); })',
110+
errors: [{message: 'Do not use Array index in keys'}],
111+
parserOptions: parserOptions
112+
},
113+
114+
{
115+
code: 'foo.every((bar, i) => { baz.push(<Foo key={i} />); })',
116+
errors: [{message: 'Do not use Array index in keys'}],
117+
parserOptions: parserOptions
118+
},
119+
120+
{
121+
code: 'foo.find((bar, i) => { baz.push(<Foo key={i} />); })',
122+
errors: [{message: 'Do not use Array index in keys'}],
123+
parserOptions: parserOptions
124+
},
125+
126+
{
127+
code: 'foo.findIndex((bar, i) => { baz.push(<Foo key={i} />); })',
128+
errors: [{message: 'Do not use Array index in keys'}],
129+
parserOptions: parserOptions
130+
},
131+
96132
{
97133
code: 'foo.map((bar, i) => React.createElement(\'Foo\', { key: i }))',
98134
errors: [{message: 'Do not use Array index in keys'}],
@@ -115,6 +151,42 @@ ruleTester.run('no-array-index-key', rule, {
115151
code: 'foo.map((bar, i) => React.createElement(\'Foo\', { key: \'foo-\' + i + \'-bar\' }))',
116152
errors: [{message: 'Do not use Array index in keys'}],
117153
parserOptions: parserOptions
154+
},
155+
156+
{
157+
code: 'foo.forEach((bar, i) => { baz.push(React.createElement(\'Foo\', { key: i })); })',
158+
errors: [{message: 'Do not use Array index in keys'}],
159+
parserOptions: parserOptions
160+
},
161+
162+
{
163+
code: 'foo.filter((bar, i) => { baz.push(React.createElement(\'Foo\', { key: i })); })',
164+
errors: [{message: 'Do not use Array index in keys'}],
165+
parserOptions: parserOptions
166+
},
167+
168+
{
169+
code: 'foo.some((bar, i) => { baz.push(React.createElement(\'Foo\', { key: i })); })',
170+
errors: [{message: 'Do not use Array index in keys'}],
171+
parserOptions: parserOptions
172+
},
173+
174+
{
175+
code: 'foo.every((bar, i) => { baz.push(React.createElement(\'Foo\', { key: i })); })',
176+
errors: [{message: 'Do not use Array index in keys'}],
177+
parserOptions: parserOptions
178+
},
179+
180+
{
181+
code: 'foo.find((bar, i) => { baz.push(React.createElement(\'Foo\', { key: i })); })',
182+
errors: [{message: 'Do not use Array index in keys'}],
183+
parserOptions: parserOptions
184+
},
185+
186+
{
187+
code: 'foo.findIndex((bar, i) => { baz.push(React.createElement(\'Foo\', { key: i })); })',
188+
errors: [{message: 'Do not use Array index in keys'}],
189+
parserOptions: parserOptions
118190
}
119191
]
120192
});

0 commit comments

Comments
 (0)