Knockout.js - 按另一个可观察数组的属性对可观察数组进行排序

时间:2014-06-24 08:18:39

标签: javascript arrays sorting knockout.js

很抱歉,如果标题不具有描述性!我试图根据另一个可观察数组的顺序重新排序一个可观察数组。例如

self.tagging_fields = ko.observableArray(['field_1', 'field_2', 'field_3'])

function Tag(data){
    var self = this;
    self.field_name = ko.observable(data.field_name);

}

var example_tags = [
    new Tag({field_name : "field_3"}),
    new Tag({field_name : "field_2"}),
    new Tag({field_name : "field_1"})
]

self.tags = ko.observableArray(example_tags);

//This is what I want to achieve
var after_sorting = [
    { field_name : "field_1" },
    { field_name : "field_2" },
    { field_name : "field_3" }
]

我尝试做的是根据self.tagging_fields中出现的顺序,按self.tags中的field_name对标记对象的顺序进行排序。任何人都可以帮我为这个操作编写自定义排序功能

更新

我已经设法在输出foreach中实现了我想要的东西

我通过在输出foreach

中进行比较来解决这个问题
<div data-bind="foreach: { data: $root.tagging_fields, as : 'tagging_field' }">
     <div data-bind="foreach: { data : line.tags, as : 'tag' }">
          <div data-bind="if: tag.field_name() === tagging_field">
              <span data-bind="text: tag.field_name"></span>
              <input data-bind="value: tag.value"/><br/>
          </div>
     </div>
</div>`

我知道它可能不是最好的方式,但它有效!

1 个答案:

答案 0 :(得分:0)

像(未经测试)的东西:

self.tags.sort(function(left, right) { 
    var leftIndex = self.tagging_fields.indexOf(left);
    var rightIndex = self.tagging_fields.indexOf(right);
    return leftIndex  == rightIndex 
        ? 0 : (leftIndex  < rightIndex  ? -1 : 1) 
});

请参阅doc here