问答

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

作者:admin 2021-05-06 我要评论

这个数据格式 let skuAttrList = [{ "attrName": "颜色", "attrValList": [{ "skuValId": "123", "skuVal": "红色" }, { "skuValId": "456", "skuVal": "黑色" }...

在说正事之前,我要推荐一个福利:你还在原价购买阿里云、腾讯云、华为云服务器吗?那太亏啦!来这里,新购、升级、续费都打折,能够为您省60%的钱呢!2核4G企业级云服务器低至69元/年,点击进去看看吧>>>)

这个数据格式

    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 这个属性

###

多数组的组合。强撸:

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);
###

试着用函数式来实现一下

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));

版权声明:本文转载自网络,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本站转载出于传播更多优秀技术知识之目的,如有侵权请联系QQ/微信:153890879删除

相关文章
  • 有如下数组,我想转换格式为这样,怎么

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

  • Golang 中如何执行带参的 curl 命令?

    Golang 中如何执行带参的 curl 命令?

  • Angular zorro-antd 动态创建表格时的

    Angular zorro-antd 动态创建表格时的

  • 请问最下面的param为什么是undefind

    请问最下面的param为什么是undefind

腾讯云代理商
海外云服务器