0

underscore.js と jquery を使用して構築している単純な Web アプリで。すべての人 (js オブジェクト) のリストについては、訪問したすべての場所 (js オブジェクト) のリストを除外しています。td人物リストは、クリックすると訪問したすべての場所のリストを表示する場所の画像アイコンを持つhtml テーブルです。アイコンは、少なくとも 1 つの場所を訪れた人にのみ表示する必要があります。ここでの問題は、人や場所のカウントが発生すること2000です100。したがって、以下のコードは2000*100組み合わせを実行します。ブラウザから、スクリプトが応答しないと不平を言われます。コードは以下に提供されています

_.each(peopleList, function (person, index, list) {

    //filter the respective places for people
    var visitedPlaces = _.filter(places, function (place) {
        return place.PeopleId == person.Id;
    });

    if (_.isEmpty(visitedPlaces)) {
        $("a#" + place.PeopleId).remove();
    }
});

とてもシンプルですね。各人について、訪問した場所が追跡されているかどうかを確認します。上記のコードを最適化して、ブロックを解除してレスポンシブにする方法を教えてください。_.deferとところどころ入れてみ_.delayたが改善せず

4

3 に答える 3

2

FWIW、これがアンダースコアで解決する方法です。

function removeNonTravelers(people, visits) {
    var travelers    = _.pluck(visits, 'PeopleId'),
        nonTravelers = _.reject(people, function (person) {
            return _.contains(travelers, person.Id);
        });

    $(_.map(nonTravelers, document.getElementById)).remove();
}

http://jsfiddle.net/FWzeN/

于 2013-04-24T11:29:29.810 に答える
1

私の提案は、アンダースコアを削除して、これにプレーンな JS を使用することです。

function removeNonTravelers(people, visits) {
    var i, peopleId,
        numPeople = people.length,
        numVisits = visits.length,
        index = {}, nonTravelers = [];

    // index
    for (i = 0; i < numVisits; i++) {
        peopleId = visits[i].PeopleId;

        if (!index.hasOwnProperty(peopleId)) {
            index[peopleId] = 1;
        } else {
            index[peopleId]++;
        }
    }

    // find HTML elements to remove
    for (i = 0; i < numPeople; i++) {
        peopleId = people[i].Id;

        if (!index.hasOwnProperty(peopleId)) {
            nonTravelers.push(document.getElementById(peopleId));
        }
    }

    // remove them all at once
    $(nonTravelers).remove();
}

これはかなり高速です。私が間違いを犯していなければ、あなたのテスト ケース (2000 人、100 か所) は、かなり古いラップトップ (DOM 操作を除く) で 1 秒あたり 700 回を超える操作でした。

自分で試してみてください: http://jsperf.com/where-not-exists-in-javascript

于 2013-04-24T06:35:13.363 に答える
0
var hashMap = {};

_.each(places, function(place) {
  hashMap[place.PeopleId] = place;
});

_.each(peopleList, function (person, index, list) {

    //filter the respective project documents
    var visitedPlaces = hashMap[person.id];

    if (visitedPlaces) {
        $("a#" + place.PeopleId).remove();
    }
});
于 2013-04-24T06:32:06.177 に答える