商品sku数组的实现,最好是用reduce

发布于 2022-09-06 23:36:49 字数 2538 浏览 10 评论 0

原始数组,数组不固定,可能有多个,id和name不同,sid可以相同(相同属于同一类)

var arr = [
    { "id": "1", "sid": "mm", "name": "黑色" },
    { "id": "2", "sid": "mm", "name": "白色" },
    { "id": "3", "sid": "xx", "name": "64G" },
    { "id": "4", "sid": "xx", "name": "128G" },
    { "id": "5", "sid": "yy", "name": "normal" },
    { "id": "6", "sid": "yy", "name": "plus" }
]

结果组成

var arr2 = [
    { name: '黑色,64G,normal', attrs: [{ "id": "1", "sid": "mm", "name": "黑色" }, { "id": "3", "sid": "xx", "name": "64G" }, { "id": "5", "sid": "yy", "name": "normal" }] },
    { name: '黑色,64G,plus', attrs: [{ "id": "1", "sid": "mm", "name": "黑色" }, { "id": "3", "sid": "xx", "name": "64G" }, { "id": "6", "sid": "yy", "name": "plus" }] },
    { name: '黑色,128G,normal', attrs: [{ "id": "1", "sid": "mm", "name": "黑色" }, { "id": "4", "sid": "xx", "name": "128G" }, { "id": "5", "sid": "yy", "name": "normal" }] },
    { name: '黑色,128G,plus', attrs: [{ "id": "1", "sid": "mm", "name": "黑色" }, { "id": "4", "sid": "xx", "name": "128G" }, { "id": "6", "sid": "yy", "name": "plus" }] },
    { name: '白色,64G,normal', attrs: [{ "id": "2", "sid": "mm", "name": "白色" }, { "id": "3", "sid": "xx", "name": "64G" }, { "id": "5", "sid": "yy", "name": "normal" }] },
    { name: '白色,64G,plus', attrs: [{ "id": "2", "sid": "mm", "name": "白色" }, { "id": "3", "sid": "xx", "name": "64G" }, { "id": "6", "sid": "yy", "name": "plus" }] },
    { name: '白色,128G,normal', attrs: [{ "id": "2", "sid": "mm", "name": "白色" }, { "id": "4", "sid": "xx", "name": "128G" }, { "id": "5", "sid": "yy", "name": "normal" }] },
    { name: '白色,128G,plus', attrs: [{ "id": "2", "sid": "mm", "name": "白色" }, { "id": "4", "sid": "xx", "name": "128G" }, { "id": "6", "sid": "yy", "name": "plus" }] },
]

如果

var arr = [
    { "id": "1", "sid": "mm", "name": "黑色" },
    { "id": "2", "sid": "mm", "name": "白色" },
    { "id": "3", "sid": "xx", "name": "64G" },
    { "id": "4", "sid": "xx", "name": "128G" }
    ]
var arr2 = [
    { name: '黑色,64G', attrs: [{ "id": "1", "sid": "mm", "name": "黑色" }, { "id": "3", "sid": "xx", "name": "64G" }] },
    { name: '黑色,128G', attrs: [{ "id": "1", "sid": "mm", "name": "黑色" }, { "id": "4", "sid": "xx", "name": "128G" }] },
    { name: '白色,64G', attrs: [{ "id": "2", "sid": "mm", "name": "白色" }, { "id": "3", "sid": "xx", "name": "64G" }] },
    { name: '白色,128G', attrs: [{ "id": "2", "sid": "mm", "name": "白色" }, { "id": "4", "sid": "xx", "name": "128G" }] },
]

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

筱果果 2022-09-13 23:36:49

经过大佬指点,了解了这是笛卡尔积,参考了笛卡尔积算法
本题的解析如下,代码有点乱,请谅解

function descartes() {
    let newObj = {}
    let newArr = [];
    arr.forEach((item, index) => {
        if (newObj.hasOwnProperty(item.sid)) {
            newObj[item.sid].push(item)
        } else {
            newObj[item.sid] = [];
            newObj[item.sid].push(item);
        }
    })
    newArr = Object.values(newObj);
    let arr1;
    arr1 = newArr[0].map((item) => {
        return { name: item.name, attrs: [item] }
    })
    newArr[0] = arr1;
    if (newArr.length === 1) {
        return arr1;
    } else {
        return newArr.reduce((col, set) => {
            let res = [];
            col.forEach((c) => {
                set.forEach((s) => {
                    let t = { name:"", attrs: [] }
                    t.attrs = t.attrs.concat(c.attrs);
                    t.attrs.push(s);
                    t.name = c.name + s.name;
                    res.push(t);
                })
            });
            return res;
        });
    }
}
let arr2 = descartes();
console.log(JSON.stringify(arr2))
欲拥i 2022-09-13 23:36:49

按照当前重组对象(就算写在reduce也是一样的,还是纯函数的形式重组你的对象),等于说就是sid一样的抽一个出来,然后重新组成一个对象放到另外一个数组里。大致思路就这样

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文