5

これはおそらく以前にかなりの回数尋ねられたことがありますが、適切な解決策を見つけるのに苦労しています.

これに似たmongoクエリのJSON結果があります:

var data = [{ _id: 123, name: "Test"}, { _id: 124, name: "Test2" }]

これは私が持っているデータの非常に単純なバージョンです。次のような「_id」プロパティに一致する配列を見つけてオブジェクト化できる必要があります。

data.find({ _id: 123 }); // returns 0
data.find({ _id: 124 }); // returns 1

誰かがこれに対する適切な解決策を知っていれば、それは大歓迎です。

更新しました:

@Rocket Hazmat から提供された回答を使用して、Angular 用のきちんとした小さなモジュールを作成しました。私はオブジェクトを扱っているので、mongo と同様の方法で json をクエリする方法が必要でした。

angular.module("myModule").factory("obj", function() {
    return {
        findKey: function(query, data) {
            for (var i = 0, l = data.length; i < l; i +=1) {
                var item = data[i],
                    match = true;
                // Check each object
                for (var x in query) {
                    if (item[x] !== data[x]) {
                        match = false;
                        break;
                    }
                }
                // Did it match ?
                if (match) {
                    return i;
                }
            }
            return false;
        }
    }
});

次に、これをコントローラーで使用できます。

angular.module("myModule")
    .controller("mainCtrl", ["$scope", "obj", function($scope, $obj) {
        // This would be the result of an ajax request
        $scope.people = [
            { _id: 1, name: "Test1" },
            { _id: 2, name: "Test2" },
            { _id: 3, name: "Test3" }
        ];

        $obj.findKey({ _id: 1, name: "Test1" }, $scope.people); // 0
        $obj.findKey({ _id: 2 }, $scope.people); // 1
        $obj.findKey({ name: "Test2"}, $scope.people); // 1
        $obj.findKey({ _id: 3, name: "Test3" }, $scope.people); // 2
        $obj.findKey({ _id: 3, name: "Test1" }, $scope.people); // false
    }]);

これは大規模なアプリケーションの奥深くに埋もれてしまうため、スコープを簡単に操作できるようにアイテムのキーをすばやく取得する方法が必要でした。

4

3 に答える 3

2

Arrayに関数を追加することで新しい機能を持つオブジェクトを拡張でき、関数を呼び出す所有者を参照するためにArray.prototype使用できます。this

find() メソッド内で、filter()関数を使用してコレクションをフィルタリングできます。

var data = [{ _id: 123, name: "Test"}, { _id: 124, name: "Test2" }]

Array.prototype.find = function(obj){
    return this.filter(function(item){
        return (item._id === obj._id);
    });
}

var result = data.find({_id: 123});
于 2013-08-27T16:19:47.127 に答える
2

配列をループして各オブジェクトを比較し、探しているキーが含まれているかどうかを確認する必要があります。

ここに私がすぐにハッキングしたものがあります。

Array.prototype.find = function(obj){
    // Loop through array
    for(var i = 0, len = this.length; i < len; i++){
        var ele = this[i],
            match = true;
        // Check each object
        for(var x in obj){
            if(ele[x] !== obj[x]){
                match = false;
                break;
            }
        }
        // Did it match?
        if(match){
            return i;
        }
    }
};

次に、示したように実行します。

data.find({ _id: 124 }); // 1
于 2013-08-27T16:19:58.507 に答える