有如下数组,我想转换格式为这样,怎么转换呢

发布于 2022-09-12 22:11:56 字数 1694 浏览 15 评论 0

这个数据格式

    let skuAttrList = [{
            "attrName": "颜色",
            "attrValList": [{
                "skuValId": "123",
                "skuVal": "红色"
            }, {
                "skuValId": "456",
                "skuVal": "黑色"
            }]
        }, {
            "attrName": "尺寸",
            "attrValList": [{
                "skuValId": "789",
                "skuVal": "200ml"
            }, {
                "skuValId": "1011",
                "skuVal": "500ml"
            }]
        }];

我现在转换为

s1 等于颜色的id,因为尺寸有多个,所以一个s1两个s2

let newList = [
            {"s1":"123","s2":"789"},//s1颜色第一个id s2尺寸第一个id
            {"s1":"123","s2":"1011"},//s1颜色第一个id s2尺寸第二个id
            {"s1":"456","s2":"789"},//s1颜色第二个id s2尺寸id
            {"s1":"456","s2":"1011"}//s1颜色第二个id s2尺寸id
        ]

skuAttrList是动态的可能会多个,如果skuAttrList数组是

let skuAttrList = [
{
        "attrName": "颜色",
        "attrValList": [{
            "skuValId": "123",
            "skuVal": "红色"
        }, {
            "skuValId": "456",
            "skuVal": "黑色"
        }]
    }, 
    {
        "attrName": "尺寸",
        "attrValList": [{
            "skuValId": "789",
            "skuVal": "200ml"
        }, {
            "skuValId": "1011",
            "skuVal": "500ml"
        }]
    },
     {
        "attrName": "外观",
        "attrValList": [{
            "skuValId": "789",
            "skuVal": "奢华"
        }, {
            "skuValId": "1011",
            "skuVal": "中等"
        },
        {
            "skuValId": "1011",
            "skuVal": "普通"
        }
        ]
    },
    ];

那么对应的就要加上 s3 这个属性

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

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

发布评论

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

评论(2

情魔剑神 2022-09-19 22:11:56

多数组的组合。强撸:

function getPath(skuAttrList) {
    var result = null;
    for(let i = skuAttrList.length - 1; i >= 0; --i) {
        const { attrValList } = skuAttrList[i];      
        const currentNodePathList = attrValList.reduce((currentNodePathList, attrVal) => {
            const { skuValId } = attrVal
            currentNodePathList.push({ [`s${i + 1}`]:  skuValId});
            return currentNodePathList;
        }, []);

        if(!result) {
            result = currentNodePathList;
        } else {
            const tempResult = [];
            currentNodePathList.forEach(path => {
                result.forEach(preNodePath => {                    
                    tempResult.push({ ...path, ...preNodePath});
                })
            });
            result = tempResult;
        }       
    }
    return result
}

// TEST
getPath(skuAttrList);
蓝天 2022-09-19 22:11:56

试着用函数式来实现一下

const { curry, compose } = require('ramda');
// 生成[[{s1:xx},{s1:xx}], [{s2:xx},{s2:xx}]] 数组
const getObj = curry((prefix, prop, propId, list) => {
  let index = 0;
  return list.map((value) => {
    index += 1;
    const fullProp = prefix + index;
    return Array.isArray(value[prop])
      ? value[prop].map((v) => ({ [fullProp]: v[propId] }))
      : [];
  });
});

// 用累加器实现
const getList = (list) => {
  const res = list.reduce((total, item) => total.map((_) => item.map((v) => ({ ..._, ...v })))
    .flat());
  return res;
};

const getData = compose(getList, getObj('s', 'attrValList', 'skuValId'));
const skuAttrList = [
  {
    attrName: '颜色',
    attrValList: [
      {
        skuValId: '123',
        skuVal: '红色',
      },
      {
        skuValId: '456',
        skuVal: '黑色',
      },
    ],
  },
  {
    attrName: '尺寸',
    attrValList: [
      {
        skuValId: '789',
        skuVal: '200ml',
      },
      {
        skuValId: '1011',
        skuVal: '500ml',
      },
    ],
  },
];

console.log(getData(skuAttrList));

const skuAttrList2 = [
  {
    attrName: '颜色',
    attrValList: [{
      skuValId: '123',
      skuVal: '红色',
    }, {
      skuValId: '456',
      skuVal: '黑色',
    }],
  },
  {
    attrName: '尺寸',
    attrValList: [{
      skuValId: '789',
      skuVal: '200ml',
    }, {
      skuValId: '1011',
      skuVal: '500ml',
    }],
  },
  {
    attrName: '外观',
    attrValList: [{
      skuValId: '789',
      skuVal: '奢华',
    }, {
      skuValId: '1011',
      skuVal: '中等',
    },
    {
      skuValId: '1012',
      skuVal: '普通',
    },
    ],
  },
];

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