Javascript 如何使用淘汰js对数据进行分组

Javascript 如何使用淘汰js对数据进行分组,javascript,jquery,knockout.js,knockout-mvc,Javascript,Jquery,Knockout.js,Knockout Mvc,我想使用knockout js对数据进行分组。 我是这样拉小提琴的 但是当我将字符作为可观察数组()时 没有显示。我能告诉我可能的问题吗 Html: js: ko.bindingHandlers.groupby={ makeTemplateValueAccessor:函数(valueAccessor){ var bindingValue、GroupedArray、Group、key、key、obj、ObjectsGroup、_i、_j、_len、_len1、_ref、, _这个=

我想使用knockout js对数据进行分组。 我是这样拉小提琴的

但是当我将字符作为可观察数组()时 没有显示。我能告诉我可能的问题吗

Html:



js:

ko.bindingHandlers.groupby={
makeTemplateValueAccessor:函数(valueAccessor){
var bindingValue、GroupedArray、Group、key、key、obj、ObjectsGroup、_i、_j、_len、_len1、_ref、,
_这个=这个;
bindingValue=ko.utils.unwrapobbservable(valueAccessor());
组={};
_ref=bindingValue.group;
对于(_i=0,_len=_ref.length;_i<_len;_i++){
obj=_ref[_i];
key=bindingValue.by(obj);
如果(组[键]==无效0){
组[键]=[obj];
}否则{
组[键]。推送(obj);
}
}
keys=(函数(){
var_结果;
_结果=[];
用于(在组中输入){
_结果:按键;
}
返回结果;
})();
if(bindingValue.sort的类型=='function'){
key.sort(bindingValue.sort);
}else if(bindingValue.sort的类型=='string'){
if(bindingValue.sort===“升序”){
keys.sort();
}else if(bindingValue.sort==='descending'){
keys.sort();
键。反转();
}
}
GroupedArray=[];
对于(_j=0,_len1=keys.length;_j<_len1;_j++){
键=键[_j];
objectsInGroup=groups[key];
objectsInGroup.$key=key;
groupedArrays.push(objectsInGroup);
}
返回函数(){
返回{
foreach:groupedarray,
templateEngine:ko.nativeTemplateEngine.instance
};
};
},
init:function(元素、valueAccessor、allBindingsAccessor、viewModel、bindingContext){
返回ko.bindingHandlers.template.init(元素、valueAccessor、allBindingsAccessor、viewModel、bindingContext);
},
更新:函数(元素、valueAccessor、allBindingsAccessor、viewModel、bindingContext){
var newValueAccessor;
newValueAccessor=ko.bindingHandlers.groupby.MakeMemplateValueAccessor(valueAccessor);
返回ko.bindingHandlers.template.update(元素、newValueAccessor、allBindingsAccessor、viewModel、bindingContext);
}
};
var模型={
this.Characters=ko.array([
{
‘年份’:‘2014年’,
“月”:“七月”,
“模块”:“巡回”
},
{
‘年份’:‘2014年’,
“月”:“七月”,
“模块”:“操作”
},
{
‘年份’:‘2014年’,
“月”:“六月”,
“模块”:“重复”
},
{
‘年份’:‘2013年’,
“月”:“六月”,
“模块”:“注意”
},
{
‘年份’:‘2015年’,
“月”:“七月”,
“模块”:“联系人”
},
{
‘年份’:‘2013年’,
“月”:“五月”,
“模块”:“联系人”
}
]);
};
ko.应用绑定(模型);

存在许多问题,例如Viewmodel对象的属性无效,因为“=”而不是“:”,然后属性以perenthesis结束

还有一个问题是Groupby自定义绑定预期的数组,而您正在传递observableArray

<div data-bind="
  groupby: { 
    group: Characters(),//Pass Array
    by: function (character) { return character.year; },
    sort: 'descending'
}">

ko.bindingHandlers.groupby = {
makeTemplateValueAccessor: function(valueAccessor) {
  var bindingValue, groupedArrays, groups, key, keys, obj, objectsInGroup, _i, _j, _len, _len1, _ref,
    _this = this;
  bindingValue = ko.utils.unwrapObservable(valueAccessor());
  groups = {};
  _ref = bindingValue.group;
  for (_i = 0, _len = _ref.length; _i < _len; _i++) {
    obj = _ref[_i];
    key = bindingValue.by(obj);
    if (groups[key] === void 0) {
      groups[key] = [obj];
    } else {
      groups[key].push(obj);
    }
  }
  keys = (function() {
    var _results;
    _results = [];
    for (key in groups) {
      _results.push(key);
    }
    return _results;
  })();
  if (typeof bindingValue.sort === 'function') {
    keys.sort(bindingValue.sort);
  } else if (typeof bindingValue.sort === 'string') {
    if (bindingValue.sort === 'ascending') {
      keys.sort();
    } else if (bindingValue.sort === 'descending') {
      keys.sort();
      keys.reverse();
    }
  }
  groupedArrays = [];
  for (_j = 0, _len1 = keys.length; _j < _len1; _j++) {
    key = keys[_j];
    objectsInGroup = groups[key];
    objectsInGroup.$key = key;
    groupedArrays.push(objectsInGroup);
  }
  return function() {
    return {
      foreach: groupedArrays,
      templateEngine: ko.nativeTemplateEngine.instance
    };
  };
},
init: function(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
  return ko.bindingHandlers.template.init(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext);
},
update: function(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
  var newValueAccessor;
  newValueAccessor = ko.bindingHandlers.groupby.makeTemplateValueAccessor(valueAccessor);
  return ko.bindingHandlers.template.update(element, newValueAccessor, allBindingsAccessor, viewModel, bindingContext);
}
};

var Model = {
this.Characters = ko.observableArray([
    {
        'year': "2014",
        'month': "july",
        'module':'tour'
    },
    {
        'year': "2014",
        'month': "july",
        'module':'action'
    },
      {
        'year': "2014",
        'month': "june",
        'module':'duplicate'
    },
    {
        'year': "2013",
        'month': "june",
        'module':'note'
    },
    {
        'year': "2015",
        'month': "july",
        'module':'contact'
    },
    {
        'year': "2013",
        'month': "may",
        'module':'contact'
    }
]);
};

ko.applyBindings(Model);
<div data-bind="
  groupby: { 
    group: Characters(),//Pass Array
    by: function (character) { return character.year; },
    sort: 'descending'
}">