0

私はこのコードを持っています:

$('#find').click(function(){
    if(first.val() != '' && second.val() != ''){
        $.getJSON(urlPersonSearch + first.val() + "?callback=?", function(json) {
            firstId = (json[0].id != undefined) ? json[0].id : '';
            if(firstId != '') result = grabMovies(firstId);
            var i = result[0].filmography.length;
            while(i--){
                movies[result[0].filmography[i].id] = result[0].filmography[i].name;
            }
        });
        $.getJSON(urlPersonSearch + second.val() + "?callback=?", function(json) {
            secondId = (json[0].id != undefined) ? json[0].id : '';
            if(secondId != '') result = grabMovies(secondId);
            var i = result[0].filmography.length;
            while(i--){
                movies[result[0].filmography[i].id] = result[0].filmography[i].name;
            }
        });

    }

});


function grabMovies(id){
    $.getJSON(urlPersonResult + id + "?callback=?", function(json) {
        return json;
    });
}

今、私がやろうとしているのは、ID と Movie Name をキー/値として持つオブジェクトになることです。最終的に、2 つの json 結果の一致のみを含むオブジェクトを取得しようとしています。すなわち。

最初の結果が

23 = こんにちは、283 = さようなら、

そして2番目の結果は

23 = こんにちは、294 = さようなら

私はのオブジェクトで終わるだろう

23 = こんにちは

これを行う方法について誰かアドバイスがありますか?

4

2 に答える 2

0

私に理解させてください:あなたは2つのセットの間の交差点を探しています。私はあなたのコードで何が起こっているのか完全にはわかりません-あなたはそれらのループを持っています:

movies[result[0].filmography[i].id] = result[0].filmography[i].name;

それらは交差点を見つけるためのあなたの試みだと思います。その場合、私が行うことは、単一の「映画」オブジェクトではなく、2つのオブジェクトを設定することです。

$('#find').click(function(){
    var initalMatches = {}; //so this is available to the callbacks below
    if(first.val() != '' && second.val() != ''){
     $.getJSON(urlPersonSearch + first.val() + "?callback=?", function(json) {
        var filmogradphy, i;
        firstId = (json[0].id != undefined) ? json[0].id : '';
        if(firstId != '') result = grabMovies(firstId);
        filmogradphy = result[0].filmogradphy;
        i = filmography.length;
        while(i--){
            initalMatches[filmogradphy[i].id] = filmogradphy[i].name;
        }
    });
    $.getJSON(urlPersonSearch + second.val() + "?callback=?", function(json) {
        var filmogradphy, i, id;
        secondId = (json[0].id != undefined) ? json[0].id : '';
        if(secondId != '') result = grabMovies(secondId);
        filmogradphy = result[0].filmogradphy;
        i = filmography.length;
        while(i--){
            id = filmogradphy[i].id;
            if( "undefined" !== initalMatches[id] ){
                movies[id] = filmography[i].name;
            }
        }
    });

}

});

ここでかなりのリファクタリングを行うことができますが、これは機能するはずです:-)

于 2012-04-14T19:28:36.520 に答える
0

配列交差関数を探しています。Underscore.jsには 1 つがあります。だから私はあなたにそれを使うように言う準備ができていましたが、それはこの目的には役に立ちません. 私が試したことを見てください:

var a = [{23:'hello'},{283:'goodbye'}],
    b = [{23:'hello'},{294:'bye'}];

_.intersection(a,b); // produces []

// investigating further
a.indexOf({23:'hello'}); // -1

ここでの根本的な問題は、JavaScript におけるオブジェクトの等価性です。また、

({23:'hello'} === {23:'hello'}); // false
({} === {}) // false

2 つの JavaScript オブジェクトは、キーと値が同じであっても、互いに等価ではありません。これは、Javascript のオブジェクト リテラルが内部でコンストラクターを呼び出し、それによってメモリ内に新しい場所を予約することに関係しています。

ソリューション

Underscore の _.indexOf メソッドにバグがあるようです。それ以外は、素晴らしいライブラリであり、使用することをお勧めします。次のように拡張します。

_.mixin({
    deepIndexOf: function (array, item, isSorted) {
        if (array == null) return -1;
        var i, l;
        if (isSorted) {
          i = _.sortedIndex(array, item);
          return _.isEqual(array[i],item) ? i : -1;
        }
        for (i = 0, l = array.length; i < l; i++) if (i in array && _.isEqual(array[i],item)) return i;
        return -1;
    },
    deepIntersection: function (array) {
        var rest = Array.prototype.slice.call(arguments, 1);
        return _.filter(_.uniq(array), function(item) {
          return _.every(rest, function(other) {
            return _.deepIndexOf(other, item) >= 0;
          });
        });
      }
});

_.deepIntersection(a,b)これで、次のように実行できます。

var a = [{23:'hello'},{283:'goodbye'}],
    b = [{23:'hello'},{294:'bye'}];

_.deepIntersection(a,b); // produces [{23:'hello'}]
于 2012-04-14T19:47:41.350 に答える