9

バックボーン コレクションから複数の属性を取得しようとしていますが、返されますundefined

コレクション

{
    id:1,
    name:"raju",
    age:23,
    sex:male,
    hobbies:..
}
{
    id:2,
    name:"ramesh",
    age:43,
    sex:male,
    hobbies:..
}

... //many models

コレクションから複数の属性を取得しようとしています。

collection.pluck(["id","name","age","sex"]);

期待される出力

[{//multiple attributes},{}]

複数の属性を取得する別の方法はありますか?

4

3 に答える 3

17

@elclanrs が言ったように、collection.pluckは単一の属性を抽出するため、カスタム抽出関数で_.mapを使用する必要があります。何かのようなもの

var c = new Backbone.Collection([
    {id: 1, name: "raju", age: 23, sex: "male"},
    {id: 2, name: "ramesh", age: 43, sex: "male"}
]);

var plucked = c.map(function (model) {
    return _.pick(model.toJSON(), ["name", "age"]);
});
console.log(plucked);

そしてデモhttp://jsfiddle.net/U7p9u/


Collection.invokeとを組み合わせることで、この呼び出しを簡素化できます。Model.pick

var c = new Backbone.Collection([
    {id: 1, name: "raju", age: 23, sex: "male"},
    {id: 2, name: "ramesh", age: 43, sex: "male"}
]);

plucked = c.invoke("pick", ["name", "age"]);  
console.log(plucked);

http://jsfiddle.net/U7p9u/5/


同様に、抽出関数がモデルのプロトタイプで定義されている場合:

var M = Backbone.Model.extend({
    mypluck: function () {
        return this.pick("name", "age");
    }
});

var C = Backbone.Collection.extend({
    model: M
});

var c = new C([
    {id: 1, name: "raju", age: 23, sex: "male"},
    {id: 2, name: "ramesh", age: 43, sex: "male"}
]);

var plucked = c.invoke("mypluck");
console.log(plucked);

http://jsfiddle.net/U7p9u/3/

于 2013-06-15T08:13:12.500 に答える
3

ドキュメントには次のように書かれています。

「[pluck is the] map を呼び出し、イテレータから単一の 属性を返すことと同じです。」

これは、基本的にコレクション内の1 つのアイテムをそのプロパティの1 つに置き換えているため、複数のプロパティでは不可能であると私に信じさせます。だから基本的にあなたはこれをやっています:

var collect = [{a:'foo',b:'baz'},{a:'lol',b:'fur'}];

var key = 'a';
var result = collect.map(function(o){ return o[key] });

考えられる解決策は、次のように、配列を返してからフラット化することです。

result = [].concat.apply([],collect.map(function(o){ return [o.a,o.b]; }));

console.log(result); //=> ["foo", "baz", "lol", "fur"]
于 2013-06-15T07:52:34.713 に答える
0

http://jsfiddle.net/CoryDanielson/Lj3r85ew/

selectコレクションとモデルにメソッドを追加できます。
(または、適切と思われる名前を付けてください)

/**
    Backbone Model Select/Multi-get -------------------------------------------
*/

Backbone.Model.prototype.select = function(props) {  
    if ( arguments.length > 1 ) {
        props = slice.call(arguments);
    }
    if ( _.isArray(arguments[0]) ) {
        props = arguments[0];
    }

    // If requesting multiple, return all props
    if ( _.isArray(props) ) {
        return _.object(props, _.map(props, _.bind(this.get, this)));
    }
    // Else, return single property
    return this.get(props);
}

/**
    Backbone Collection Select ------------------------------------------------
*/
Backbone.Collection.prototype.select = function(props) {
    if ( arguments.length > 1 ) {
        props = slice.call(arguments);
    }
    if ( _.isArray(arguments[0]) ) {
        props = arguments[0];
    }

    return _.map(this.models, function(m) {
        return m.select(props);
    });
}

これにより、コレクションのすべてのモデルで複数のプロパティを選択したり、モデルで複数のプロパティを選択したりできます。

collection.select('id', 'first', 'last');   // or ['id', 'first', 'last']
model.select('first', 'last');              // or ['first', 'last']
于 2014-12-12T01:22:42.593 に答える