克隆适合多个类别并按这些类别分组的JSON对象

时间:2018-03-30 20:39:05

标签: javascript json

我发现了一些javascript,允许我通过某些属性对JSON对象进行分组。它工作得很好但我需要能够克隆多个类别中的对象并按这些类别/属性对它们进行分组。例如:

 var products = [{"Name": "Product 1", 
  "Details": "Lorum Ipsum lorum ipsum 1",
  "Cost": 100,
  "Function": "Engineering",
  "Type": "Laptop, Tablet", 
"ID":0
},
{"Name":"Product 2",
  "Details": "Lorum Ipsum lorum ipsum 2",
  "Cost": 120,
  "Function": "Healthcare",
  "Type": "Laptop, Tablet", 
"ID":1
},
{"Name": "Product 3",
  "Details": "Lorum Ipsum lorum ipsum 3",
  "Cost": 130,
  "Function": "Engineering",
  "Type": "Desktop", 
"ID":2
}];

应该成为

[{"Name": "Product 1", 
  "Details": "Lorum Ipsum lorum ipsum 1",
  "Cost": 100,
  "Function": "Engineering",
  "Type": "Laptop", 
"ID":0
},
{"Name":"Product 2",
  "Details": "Lorum Ipsum lorum ipsum 2",
  "Cost": 120,
  "Function": "Healthcare",
  "Type": "Laptop", 
"ID":1
}],
[{"Name": "Product 1", 
  "Details": "Lorum Ipsum lorum ipsum 1",
  "Cost": 100,
  "Function": "Engineering",
  "Type": "Tablet", 
"ID":0
},
{"Name":"Product 2",
  "Details": "Lorum Ipsum lorum ipsum 2",
  "Cost": 120,
  "Function": "Healthcare",
  "Type": "Tablet", 
"ID":1
}],
[{"Name": "Product 3",
  "Details": "Lorum Ipsum lorum ipsum 3",
  "Cost": 130,
  "Function": "Engineering",
  "Type": "Desktop", 
"ID":2
}]

到目前为止,这是我的代码:

 function LoadDevicesByType(){
    var result = groupBy(products, function(item)
    {
      return [item.Type];
    });
    return result;  
  }

  function groupBy( array , f )
  {
    var groups = {};
    array.forEach( function( o )
    {
      var group = JSON.stringify( f(o) );
      groups[group] = groups[group] || [];
      groups[group].push( o );  
    });
    return Object.keys(groups).map( function( group )
    {
      return groups[group]; 
    })
  }

知道我是怎么做到的吗?现在我只是通过Type属性

进行分组

2 个答案:

答案 0 :(得分:3)

只需拆分Type字符串并复制外部对象:

const input = [{"Name": "Product 1", 
  "Details": "Lorum Ipsum lorum ipsum 1",
  "Cost": 100,
  "Function": "Engineering",
  "Type": "Laptop, Tablet", 
"ID":0
},
{"Name":"Product 2",
  "Details": "Lorum Ipsum lorum ipsum 2",
  "Cost": 120,
  "Function": "Healthcare",
  "Type": "Laptop, Tablet", 
"ID":1
},
{"Name": "Product 3",
  "Details": "Lorum Ipsum lorum ipsum 3",
  "Cost": 130,
  "Function": "Engineering",
  "Type": "Desktop", 
"ID":2
}];

const separatedByTypeObj = {};
input.forEach(product => {
  product.Type.split(', ').forEach(type => {
    const newProduct = JSON.parse(JSON.stringify(product));
    newProduct.Type = type;
    if (!separatedByTypeObj[type]) separatedByTypeObj[type] = [];
    separatedByTypeObj[type].push(newProduct)
  });
});
const separatedByTypeArr = Object.values(separatedByTypeObj);
console.log(separatedByTypeArr);

(使用.reduce会更优雅,但如果您不熟悉数组方法,forEach可能更容易理解)

答案 1 :(得分:1)

var products = [{
        "Name": "Product 1",
        "Details": "Lorum Ipsum lorum ipsum 1",
        "Cost": 100,
        "Function": "Engineering",
        "Type": "Laptop, Tablet",
        "ID": 0
    },
    {
        "Name": "Product 2",
        "Details": "Lorum Ipsum lorum ipsum 2",
        "Cost": 120,
        "Function": "Healthcare",
        "Type": "Laptop, Tablet",
        "ID": 1
    },
    {
        "Name": "Product 3",
        "Details": "Lorum Ipsum lorum ipsum 3",
        "Cost": 130,
        "Function": "Engineering",
        "Type": "Desktop",
        "ID": 2
    }
];

function modifiedOutput() {
    const output = [];
    products.forEach(x => {
        x.Type.split(",").forEach(t => {
            const itemType = t.trim();
            const newX = Object.assign({}, x, {
                Type: itemType
            });
            output.push(newX);
        });
    });

    console.log(output);
    return output;
}

const output = modifiedOutput();

https://codepen.io/zoom2ashish/pen/RMMErN