indexOf を使用すると、最初に出現した位置を特定できます。
例えば:
a=[1,2,4,2];
b=a.indexOf(2);
alert(b) //returns 1
両方の位置を見つけるために indexOf に代わる関数はありますか、それとも何か不足していますか? ショートカットを探しています。もちろん、私はいつでもそれを見つけるために簡単な外観を書くことができます.
indexOf を使用すると、最初に出現した位置を特定できます。
例えば:
a=[1,2,4,2];
b=a.indexOf(2);
alert(b) //returns 1
両方の位置を見つけるために indexOf に代わる関数はありますか、それとも何か不足していますか? ショートカットを探しています。もちろん、私はいつでもそれを見つけるために簡単な外観を書くことができます.
indexOf は 2 番目の引数 (開始インデックス) を取ります
だからa.indexOf(2,2)
あなたに3を与えるでしょう
一般化すると、 の場合x = a.indexOf(2)
、次のインスタンスはa.indexOf(2, x+1)
1つのループで:
function indexesOf(arr, target) {
let index = [];
// For each element, index pushed in index[]
arr.forEach((el, i) => {
if (el === target) index.push(i)
});
return index;
}
alert(indexesOf([1, 2, 4, 2], 2)); // -> 1, 3
2 つのループを使用:
function indexesOf(arr, target) {
// Map matching elements to their index, and others to null.
return arr.map(function (el, i) { return (el === target) ? i : null; })
// Throw out the nulls.
.filter(function (x) { return x !== null; });
}
alert(indexesOf([1, 2, 4, 2], 2)); // -> 1, 3
最近の ECMAScript 5 メソッドを使用しているため、新しい Harmony 提案メソッドの使用Array.map
を検討することをお勧めします。Array.filter
Object.is
Javascript
var func = {}.is,
is;
if (typeof func === "function") {
is = func;
} else {
is = function is(x, y) {
if (x === y) {
if (x === 0) {
return 1 / x === 1 / y;
}
return true;
}
var x1 = x,
y1 = y;
return x !== x1 && y !== y1;
};
}
function indexesOf(array, value) {
if (!Array.isArray(array)) {
throw new TypeError("First attribute must be an array.");
}
return array.map(function (element, index) {
if (is(value, element)) {
return index;
}
}).filter(function (element) {
return typeof element === "number";
});
}
var test = [1, 2, 4, 2];
console.log(indexesOf(test, 2));
出力
[1, 3]
jsfiddleについて
更新:私は過去に、人々が「しかし、これはまさにこれらの新しいメソッドが設計されたものである」という強い信念を持っているときにループを使用したことで非難されてきました。そこで、代替のシングル ループ ソリューションも紹介します。
ECMAScript 5Array.reduce
Javascript
function indexesOf(array, value) {
if (!Array.isArray(array)) {
throw new TypeError("First attribute must be an array.");
}
return array.reduce(function (previous, current, index) {
if (is(value, current)) {
previous.push(index);
}
return previous;
}, []);
}
jsfiddleについて
ECMAScript 5Array.forEach
Javascript
function indexesOf(array, value) {
if (!Array.isArray(array)) {
throw new TypeError("First attribute must be an array.");
}
var indexes = [];
array.forEach(function (element, index) {
if (is(value, element)) {
indexes.push(index);
}
});
return indexes.
}
jsfiddleについて
ECMAScript 5Array.indexOf
注: このメソッドは、のインデックスを見つけることができません。 NaN
Array.lastIndexOf
逆に使用して作業することもできます
Javascript
function indexesOf(array, value) {
if (!Array.isArray(array)) {
throw new TypeError("First attribute must be an array.");
}
var index = array.indexOf(value),
indexes = [];
while (index !== -1) {
indexes.push(index);
index = array.indexOf(value, index + 1);
}
return indexes;
}
jsfiddleについて
標準for
Javascript
function indexesOf(array, value) {
if ({}.toString.call(array) !== "[object Array]") {
throw new TypeError("First attribute must be an array.");
}
var indexes = [],
length,
index;
for (index = 0, length = array.length; index < length; index += 1) {
if (array.hasOwnProperty(index) && is(value, array[index])) {
indexes.push(index);
}
}
return indexes;
}
jsfiddleについて
標準while
Javascript
function indexesOf(array, value) {
if ({}.toString.call(array) !== "[object Array]") {
throw new TypeError("First attribute must be an array.");
}
var length = array.length,
indexes = []
index = 0;
while (index < length) {
if (array.hasOwnProperty(index) && is(value, array[index])) {
indexes.push(index);
}
index += 1;
}
return indexes;
}
jsfiddleについて
標準for...in
注: これは推奨されませんが、問題ないはずです。
配列の繰り返しで「for…in」を使用するのはなぜ悪い考えなのですか?
Javascript
function indexesOf(array, value) {
if ({}.toString.call(array) !== "[object Array]") {
throw new TypeError("First attribute must be an array.");
}
var indexes = [],
prop;
for (prop in array) {
if (array.hasOwnProperty(prop) && is(+prop, prop >>> 0) && is(value, array[prop])) {
indexes.push(+prop);
}
}
return indexes;
}
jsfiddleについて
注: ここで説明するソリューションはすべて、密な配列と疎な配列の両方を処理します。
最後に、これらすべてのソリューションを比較するjsperfです。
lastIndexOf() は、最後に出現したインデックスを提供します。
しかし、特定の要素 (あなたの場合は 2) のすべての出現を含むインデックスの配列が必要な場合は、ループを記述する必要があります。