2

indexOf を使用すると、最初に出現した位置を特定できます。

例えば:

a=[1,2,4,2];
b=a.indexOf(2);
alert(b) //returns 1

両方の位置を見つけるために indexOf に代わる関数はありますか、それとも何か不足していますか? ショートカットを探しています。もちろん、私はいつでもそれを見つけるために簡単な外観を書くことができます.

4

4 に答える 4

5

indexOf は 2 番目の引数 (開始インデックス) を取ります

だからa.indexOf(2,2)あなたに3を与えるでしょう

一般化すると、 の場合x = a.indexOf(2)、次のインスタンスはa.indexOf(2, x+1)

于 2013-07-11T17:27:45.967 に答える
3

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
于 2013-07-11T17:31:25.263 に答える
1

最近の ECMAScript 5 メソッドを使用しているため、新しい Harmony 提案メソッドの使用Array.mapを検討することをお勧めします。Array.filterObject.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です。

于 2013-07-11T17:58:47.257 に答える
0

lastIndexOf() は、最後に出現したインデックスを提供します。

しかし、特定の要素 (あなたの場合は 2) のすべての出現を含むインデックスの配列が必要な場合は、ループを記述する必要があります。

于 2013-07-11T17:29:45.603 に答える