我将在javascript数组中演示我的数据。我正在寻找JS或Mysql的解决方案。数据库表就像这个数组一样扁平。
[{
"id": 1,
"account_id": 1,
"size_id": null,
"color_id": null,
"style": "new-age",
"amount": "30.00"
},
{
"id": 2,
"account_id": 1,
"size_id": 1,
"color_id": null,
"style": "new-age",
"amount": "5.00"
},
{
"id": 3,
"account_id": 1,
"size_id": 1,
"color_id": 1,
"style": "new-age",
"amount": "6.00"
},
{
"id": 3,
"account_id": 1,
"size_id": 1,
"color_id": null,
"style": "old-school",
"amount": "25.00"
},
{
"id": 3,
"account_id": 1,
"size_id": null,
"color_id": null,
"style": "old-school",
"amount": "2.00"
}]
我特别关注这些专栏:
我希望结果按样式分组,例如,如果用户指定尺寸和颜色,我希望结果如下所示:
[{
"id": 3,
"account_id": 1,
"size_id": 1,
"color_id": 1,
"style": "new-age",
"amount": "6.00"
},
{
"id": 3,
"account_id": 1,
"size_id": 1,
"color_id": null,
"style": "old-school",
"amount": "25.00"
}]
另一个场景可以说他们没有指定尺寸或color_id,结果看起来像这样:
[{
"id": 1,
"account_id": 1,
"size_id": null,
"color_id": null,
"style": "new-age",
"amount": "30.00"
},
{
"id": 3,
"account_id": 1,
"size_id": null,
"color_id": null,
"style": "old-school",
"amount": "2.00"
}];
假设将始终是account_id的记录。
答案 0 :(得分:0)
此提案包含一个带有三个参数的小函数select(from, where, sort)
。
来自:数据源为数组,必需。
其中:具有一个或多个键/值对的对象,如果提供了多个键,则条件为和链接。如果是假的,则省略该参数。
sort :具有键/值对对象的数组,该对象使用值以1递增的键对结果集进行排序,以值-1递减。排序具有字符串排序。如果是假的,则省略该参数。
测试用例返回:
var data = [
{ "id": 1, "account_id": 1, "size_id": null, "color_id": null, "style": "new-age", "amount": "30.00" },
{ "id": 2, "account_id": 1, "size_id": 1, "color_id": null, "style": "new-age", "amount": "5.00" },
{ "id": 3, "account_id": 1, "size_id": 1, "color_id": 1, "style": "new-age", "amount": "6.00" },
{ "id": 3, "account_id": 1, "size_id": 1, "color_id": null, "style": "old-school", "amount": "25.00" },
{ "id": 3, "account_id": 1, "size_id": null, "color_id": null, "style": "old-school", "amount": "2.00" }
];
function select(from, where, sort) {
var data = from.slice(0);
where && Object.keys(where).forEach(function (k) {
data = data.filter(function (d) {
return d[k] === where[k];
});
});
sort && data.sort(function (a, b) {
var value = 0;
sort.some(function (el) {
var key = Object.keys(el)[0];
value = ~el[key] ? a[key].localeCompare(b[key]) : b[key].localeCompare(a[key]);
return value;
});
return value;
});
return data;
}
function print(o) {
document.body.innerHTML += '<pre>' + JSON.stringify(o, 0, 4) + '</pre>';
}
print(select(data, { color_id: 1 }, [{ style: 1 }]));
print(select(data, { size_id: 1 }, [{ style: 1 }]));
print(select(data, { color_id: null, size_id: null }, [{ style: 1 }]));
print(select(data, undefined, [{ style: 1 }, { amount: 1 }]));