0

プレイヤー名と ID で並べ替えるための 2 つのボタンがあります。のような並べ替えごとに2つの関数を使用しています。

<ul data-bind="template: { name: 'playerstmpl', foreach: players }"></ul>
<hr/>
<button data-bind="click: sortbyPlayer">Sort by Player</button>
<button data-bind="click: sortbyId">Sort by Id</button>
<script id="playerstmpl" type="text/html">
    <li> <span data-bind = "text: id"> </span>
        <input data-bind="value: FirstName" /> </li>
</script>



<script type="text/javascript">

    function Player(id, name) {
        return {
            id: ko.observable(id),
            FirstName: ko.observable(name)
            };
    }

    var viewModel = {
        players: ko.observableArray([
        new Player(64, "Yuvi"),
        new Player(22, "Gayle"),
        new Player(91, "Adam"),
        new Player(19, "Flintoff"),
        new Player(56, "Malinga")])
    };

    viewModel.sortbyPlayer = function () {
        var unsorted = viewModel.players();

        viewModel.players(unsorted.sort(viewModel.sortFunction = function (a, b) {

        return a.FirstName().toLowerCase() < b.FirstName().toLowerCase() ? -1 : 1;

        }));
    };


    viewModel.sortbyId = function () {
        var unsortedId = viewModel.players();

        viewModel.players(unsortedId.sort(viewModel.sortFunction = function (a, b) {
            return a.id() < b.id() ? -1 : 1;
        }));
    };
            ko.applyBindings(viewModel);

</script>

2 つの関数を 1 つにマージできるように、関数で渡されるプロパティを見つけようとしています。

viewModel.sortbyPlayer = function () {
        var unsorted = viewModel.players();

        viewModel.players(unsorted.sort(viewModel.sortFunction = function (a, b) {

            if (Player[a] == "FirstName") {            // is string
                return a.FirstName().toLowerCase() < b.FirstName().toLowerCase() ? -1 : 1;
            }
       else {
            return a.id() < b.id() ? -1 : 1;
        }

        }));
    };

とにかく1つの関数で並べ替えを行うことはありますか..ありがとう

4

2 に答える 2

0

より普遍的な並べ替え機能を探している場合..プロパティを確認できます..typeその.. nameこれはあなたのケースとより一般的なケースで機能します:

viewModel.sortbyPlayer = function () {
    var unsorted = viewModel.players();

    viewModel.players(unsorted.sort(viewModel.sortFunction = function (a, b) {
        if (typeof Player[a] === 'string') {            // is string
            return a.FirstName().toLowerCase() < b.FirstName().toLowerCase() ? -1 : 1;
        }
        if (typeofPlayer[a] === 'number') { 
            return a.id() < b.id() ? -1 : 1;
        }

    }));
};

arguments関数で使用されるパラメーターの配列にアクセスできる魔法のプロパティ ウィッチを使用することもできます。

function someFunctionWithRandomParams(){
    if(arguments[0]){ 
        console.log('argument 1 of type'+ typeof arguments[0] +' and value'+arguments[0])
    }
    if(arguments[1]){ 
        console.log('argument 2 of type'+ typeof arguments[1] +' and value'+arguments[1])
    }
}
于 2013-04-24T05:17:49.870 に答える