【问题标题】:Customizing KnockOut Mapping by data type按数据类型自定义 KnockOut 映射
【发布时间】:2018-08-23 12:09:15
【问题描述】:

我有一个看起来像这样的数据列表:

 "containers": [{
      "Id": 1,
      "Description": "B",
      "Properties": {}
},
 {
      "Id": 2,
      "Description": "A",
      "Properties": {}
},
 {
      "Id": 3,
      "Description": "B",
      "Properties": {}
},
 {
      "Id": 4,
      "Description": "A",
      "Properties": {}
}, 
 {
      "Id": 5,
      "Description": "C",
      "Properties": {}
}]

使用敲除和敲除映射插件,我的目标是创建自定义映射以创建类似:

 "containers": [{
    "A":[{
          "Id": 2,
          "Description": "A",
          "Properties": {}
        },
        {
          "Id": 4,
          "Description": "A",
          "Properties": {}
        }],
    "B":[{
          "Id": 1,
          "Description": "B",
          "Properties": {}
        },
        {
      "Id": 3,
      "Description": "B",
      "Properties": {}
        }], 
    "C"{
      "Id": 1,
      "Description": "C",
      "Properties": {}
    }]]

对象根据其描述分组为数组。

我尝试过这样的事情:

var mapping = {
    create: function (options) {
        var arrdata = [];
        if (!(options.data.Description in arrdata)) {
            arrdata[options.data.Description] = [];
        }
        arrdata[options.data.Description].push(ko.mapping.fromJS(options.data));
        return arrdata;

    }
}

但它只是它自己的数组中的每个对象,所以不是我在示例中期望的三个数组,而是 5 个数组,每个数组的大小为 1。如何告诉 Knockout Mapping 合并数组或创建完成此操作的映射?

【问题讨论】:

    标签: javascript knockout.js knockout-mapping-plugin


    【解决方案1】:
    var containers = [{
          "Id": 1,
          "Description": "B",
          "Properties": {}
    },
     {
          "Id": 2,
          "Description": "A",
          "Properties": {}
    },
     {
          "Id": 3,
          "Description": "B",
          "Properties": {}
    },
     {
          "Id": 4,
          "Description": "A",
          "Properties": {}
    }, 
     {
          "Id": 5,
          "Description": "C",
          "Properties": {}
    }]
    
    //Remap array of objects to object with arrays of objects
    groupedByDescription = {};
    
    containers.forEach(function(c){
      //Create object properties based on container description, and create array / push to array
      if(groupedByDescription.hasOwnProperty(c.Description)){
        groupedByDescription[c.Description].push(c);
      }else{
        groupedByDescription[c.Description] = [c];
      }
    });
    
    console.log(groupedByDescription);
    

    JS 小提琴: https://jsfiddle.net/b7g7s5h9/9/

    这对您有帮助吗?应该得到你要求的结果,但不使用 ko 映射。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-14
      • 1970-01-01
      • 2012-12-23
      • 1970-01-01
      • 1970-01-01
      • 2019-01-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多