按类型

时间:2015-10-02 17:03:44

标签: javascript mysql algorithm

我将在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"
}]

我特别关注这些专栏:

  • ACCOUNT_ID
  • 尺寸
  • 颜色

我希望结果按样式分组,例如,如果用户指定尺寸和颜色,我希望结果如下所示:

[{
    "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的记录。

  • 如果指定了color_id,请使用该记录。
  • 如果指定了size_id,请仅在帐户ID上方使用该记录。
  • 如果未指定color_id或size_id,则默认为account_id进行定价。

1 个答案:

答案 0 :(得分:0)

此提案包含一个带有三个参数的小函数select(from, where, sort)

  • 来自:数据源为数组,必需。

  • 其中:具有一个或多个键/值对的对象,如果提供了多个键,则条件为链接。如果是假的,则省略该参数。

  • sort :具有键/值对对象的数组,该对象使用值以1递增的键对结果集进行排序,以值-1递减。排序具有字符串排序。如果是假的,则省略该参数。

测试用例返回:

  1. 所有使用color_id = 1的集合,按样式升序排序。
  2. 所有设置的size_id = 1,按样式升序排序。
  3. 所有使用color_id = null和size_id = null的集合,按样式升序排序。
  4. 所有集合按样式升序和升序量排序。
  5. 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 }]));