我发现了一些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属性
进行分组答案 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();