Javascript 对同一属性上的值进行分组
我有这样一个数组:Javascript 对同一属性上的值进行分组,javascript,Javascript,我有这样一个数组: [ {unit: 35, brand: 'CENTURY'}, {unit: 35, brand: 'BADGER'}, {unit: 25, brand: 'CENTURY'}, {unit: 15, brand: 'CENTURY'}, {unit: 25, brand: 'XEGAR'} ] 我想要的是混合具有相同单位值的JSON,加入逗号分隔的品牌,这样结果数组将是: [ {unit: 35, brand: 'CENT
[
{unit: 35, brand: 'CENTURY'},
{unit: 35, brand: 'BADGER'},
{unit: 25, brand: 'CENTURY'},
{unit: 15, brand: 'CENTURY'},
{unit: 25, brand: 'XEGAR'}
]
我想要的是混合具有相同单位值的JSON,加入逗号分隔的品牌,这样结果数组将是:
[
{unit: 35, brand: 'CENTURY, BADGER'},
{unit: 25, brand: 'CENTURY, XEGAR'},
{unit: 15, brand: 'CENTURY'}
]
有人建议我使用filter()
,我在MDN上读到了这方面的内容,但我不明白的是,如何使用上次调用的参数:
使用三个参数调用回调:
vm.products.filter(
function(product, index, products){
//How do I compare here if product === any product in products
//and then add mix them up?
}
)
迭代元素并生成新数组
var-arr=[{
单位:35,
品牌:“世纪”
}, {
单位:35,
品牌:“獾”
}, {
单位:25,
品牌:“世纪”
}, {
单位:15,
品牌:“世纪”
}, {
单位:25,
品牌:“XEGAR”
}],
ind=[],
res=[];
//使用forEach或for循环迭代数组
arr.forEach(功能(v){
//正在检查单位值是否在'ind'数组中
var eleIn=ind.indexOf(v.单位);
如果(eleIn==-1){
//将单位值推送到'ind'数组
指示推力(v单位);
//将数组元素推送到`res`数组
res.push(v);
}否则
//更新品牌价值的其他案例
res[eleIn].品牌+=','+v.brand;
})
document.write(''+JSON.stringify(res,null,3)+'')代码>试试这个
var data = [
{unit: 35, brand: 'CENTURY'},
{unit: 35, brand: 'BADGER'},
{unit: 25, brand: 'CENTURY'},
{unit: 15, brand: 'CENTURY'},
{unit: 25, brand: 'XEGAR'}
];
function groupBy(field, data) {
var result = [];
var ignore = [];
for (var i = 0; i < data.length; i++) {
var current = data[i];
var isNew = true;
// Find matching elements
for (var j = 0; j < data.length; j++) {
var test = data[j];
if (test != current && result.indexOf(test) == -1 && ignore.indexOf(test) == -1) {
// If their fields match
if (test[field] == current[field]) {
for (var key in test) {
if (test.hasOwnProperty(key) && key != field) {
if (current.hasOwnProperty(key)) {
var currentValues = current[key].split(", ");
currentValues.push(test[key]);
current[key] = currentValues.join(", ");
} else {
current[key] = test[key];
}
}
}
// Add to ignore list
ignore.push(test);
}
}
}
if (ignore.indexOf(current) == -1) {
result.push(current);
}
}
return result;
}
var newData = groupBy('unit', data);
console.log(JSON.stringify(newData));
var objArray=[
{单位:35,品牌:'CENTURY'},
{单位:35,品牌:'獾'},
{单位:25,品牌:'CENTURY'},
{单位:15,品牌:'CENTURY'},
{单位:25,品牌:'XEGAR'}
];
var输出={};
var outputArr=[];
对于(变量计数器=0;计数器
我在上一次会议上提出了一个有点通用的解决方案
所做的是使用字段对数据进行分组。当它找到匹配项时,它会修改具有该字段的第一个对象,并将与该字段
匹配的其他实例上的所有属性添加到该对象中。IE:如果要在下面的单元35
实例上添加额外字段,它们将被复制到组合实例中。这可以通过注释掉最里面的else
语句来关闭
这是密码
[
{"unit":35,"brand":"CENTURY, BADGER"},
{"unit":25,"brand":"CENTURY, XEGAR"},
{"unit":15,"brand":"CENTURY"}
]
OP要求使用过滤器
解决方案。这里有一个,但并不比其他的好
var-arr=[{
单位:35,
品牌:“世纪”
}, {
单位:35,
品牌:“獾”
}, {
单位:25,
品牌:“世纪”
}, {
单位:15,
品牌:“世纪”
}, {
单位:25,
品牌:“XEGAR”
}]
var done=[];
var arr2=arr.map(功能(obj){
if(done.indexOf(obj.unit)>=0)返回;
完成。推动(对象单位);
var arrIn=arr.filter(函数(objIn){
返回obj.unit==objIn.unit;
});
返回{
单位:arrIn[0]。单位,
品牌:arrIn.map(功能(obj2){
返回品牌;
}).join(“,”)
};
});
document.write(JSON.stringify(arr2))
这是一个具有Array.prototype.filter()
和临时对象的非破坏性解决方案
var数组=[{单位:35,品牌:'CENTURY'},{单位:35,品牌:'BADGER'},{单位:25,品牌:'CENTURY'},{单位:15,品牌:'CENTURY'},{单位:25,品牌:'XEGAR'}];
函数过滤器(a){
var o={};
返回JSON.parse(JSON.stringify(a)).filter(函数(b){
如果(!(b.单位为o)){
o[b.单位]=b;
返回true;
}
o[b.单位].品牌+=','+b.品牌;
});
}
document.write(“”+JSON.stringify(过滤器(数组),0,4)+“”);
write(“”+JSON.stringify(数组,0,4)+“”)
“这个问题没有显示出任何研究成果”-询问如何处理堆栈溢出本身并不构成研究。我在mdn上读到了、filter
和、reduce
(谢谢聊天),但我真的不知道如何@Jameshorperhaps@Jameshorperhaps包括你使用它们的一些尝试,接下来的问题是,为什么您正在使用的某些特定代码不起作用,而不是“为我编写代码”的问题。尽管像往常一样,其他人似乎很乐意遵守……Thnks@JamesThorpe谢谢你的建议……有没有更简单的方法呢?也许可以使用.filter
?@feniixx,我添加了一个filter
解决方案,尽管我不认为它比这个更有效、更可读或更简单。
[
{"unit":35,"brand":"CENTURY, BADGER"},
{"unit":25,"brand":"CENTURY, XEGAR"},
{"unit":15,"brand":"CENTURY"}
]