2

オートコンプリートを使用して入力テキストに表示する値の配列を定義する必要があるため、実際には質問は先行入力ブートストラップに関連しています。

とにかく、目標は、オブジェクトの配列を読み取り、文字列の配列を返す関数を定義することです。これが私のコードです(1)。

(1) の目標は次のとおりです。1) オブジェクトの配列から文字列の配列を取得します。2) いくつかの要素を拒否して、この配列をフィルタリングします。

拒否したい要素が配列に残っているため、機能しません。実際、オートコンプリートでは false 値を取得しますが、実際にはコードが壊れています。

コードをどのように修正し、おそらく改善する必要がありますか?


(1)

element.typeahead({
    source: function ( {
        var users = _.map(app.userCollection.models, function (model) {
            if (model.get('id') === app.currentUser.id) {
                return false;
            }
            return model.get('first_name') + ' ' + model.get('last_name');
        });
        console.log(users); // [false, 'some name'];
        _.reject(users, function(name) {
            return name  === false;
        });
        console.log(users); // [false, 'some name'];
                            // why does the false value persist?
        return users;
    }
});
4

1 に答える 1

4

通常、アンダースコア メソッドは配列自体では動作しませんが、新しい配列を返しますが、各関数のアンダースコアドキュメントを個別に確認して確認することをお勧めします。この場合、アンダースコアdocsの次の文に従って、 reject が新しい配列を返すと安全に想定できます。

真偽テスト (反復子) に合格した要素を除いたリストの値を返します。

現在行っていることは次のとおりです。

_.reject(users, function(name) {
  return name  === false;
});

したがって、実際には結果をどこにも保存しません。不要な要素を除いて配列への参照を保持するには、次のようにします。

users = _.reject(users, function(name) {
  return name  === false;
});

それはあなたが望む結果をもたらすでしょうが、リファクタリングのヒントを与えましょう:

できる限りバックボーン独自のメソッドを使用すると、より読みやすいコードになります

source: function() {
  // filter the collection down to the users you want
  var users = app.userCollection.filter(function(model) {
    return model.id === app.currentUser.id;
  });
  // -> users is now an array of models

  // use map to transform each wanted user to a string giving its full name
  users = _.map(users, function(user) {
    return user.get('first_name')+' '+user.get('last_name');
  });
  // -> users is now an array of strings

  return users;
}

お役に立てれば!

于 2012-08-24T14:27:04.780 に答える