2

簡単な関数を作成しました。入力とIDとして配列があります。関数は、与えられたアイデアの「前」にすべての要素を取ると仮定します。

    function takeBefore(stars, id) {
        var taken = [];
        for(var i = 0, length = stars.length; i < length; i++) {
            if (stars[i].itemId === id) {
                break;
            }

            taken.push(stars[i]);
        }

        return taken;
    }

以下のコードは仕事をしますが、最近私は少しうるさいです。for ループといくつかの機能的なスタイルを取り除きたいです。

underscoreまたはES5機能を使用して同じ仕事をすることは可能ですか?

4

2 に答える 2

1

この種のものは通常takeWhile/と呼ばれdropWhileます。ブール値の iterator を使用して実装できますevery()

function takeWhile(array, predicate) {
    var pos = -1;
    var all = array.every(function(x, n) { 
        return (pos = n), predicate(x);
    })
    return array.slice(0, pos + all);
}

function dropWhile(array, predicate) {
    var pos = -1;
    var all = array.every(function(x, n) { 
        return (pos = n), predicate(x);
    })
    return array.slice(pos + all);
}


a = [1,2,3,4,5,6,7]
b = takeWhile(a, function(x) { return x < 5 }) // 1,2,3,4
b = dropWhile(a, function(x) { return x < 5 }) // 5,6,7
于 2013-05-11T07:06:09.760 に答える
0

次のようなことができます。

x = [1,2,3,4,5];
x.slice(0, x.indexOf(3));

結果:

[1, 2]
于 2013-05-11T07:11:13.703 に答える