js 重组数据

求助_(:3⌒゙)_

现在后台返回的数据是这样的:
selected = ['FREQUENT_PURCHASE', 'HIGH_CONSUME', 'NO_COMMUNICATE', 'DRIVE_RECORDER', 'SMART_LOCK', 'CHILD_MACHINE', 'FACE_RECS'];
但是我想要的是

selectd = {
    userTag:['FREQUENT_PURCHASE', 'HIGH_CONSUME'],
    communicationIntention:'NO_COMMUNICATE',
    products: ['DRIVE_RECORDER', 'SMART_LOCK', 'CHILD_MACHINE'],
    cloudServices: ['FACE_RECS'],
}

怎么根据下面的数据去重组??

data = {
    "CLOUD_SERVICE":[
            {
                "code":"CLOUD_STORE",
                "msg":"云存储"
            },
            {
                "code":"FACE_RECS",
                "msg":"人脸识别"
            },
            {
                "code":"WARN_CALL",
                "msg":"电话报警"
            },
            {
                "code":"HUMAN_CHECK",
                "msg":"人形检测"
            },
            {
                "code":"SERVICE_NEARLY_EXP",
                "msg":"服务快到期"
            }
        ],
        "HAVE_PRODUCT":[
            {
                "code":"CAMERA",
                "msg":"摄像机"
            },
            {
                "code":"SMART_LOCK",
                "msg":"xxxx"
            },
            {
                "code":"CAT_EYE",
                "msg":"xxxxx"
            },
            {
                "code":"SUIT",
                "msg":"套装"
            },
            {
                "code":"SMART_CURTAIN",
                "msg":"xxxx"
            },
            {
                "code":"HW_VIDEO_RECORDER",
                "msg":"硬盘录像机"
            },
            {
                "code":"SENSE_WARN",
                "msg":"传感报警"
            },
            {
                "code":"CHILD_MACHINE",
                "msg":"儿童机器人"
            },
            {
                "code":"DRIVE_RECORDER",
                "msg":"行车记录仪"
            },
            {
                "code":"SPORT_CAMERA",
                "msg":"运动相机"
            },
            {
                "code":"NETWORK",
                "msg":"网络通讯"
            },
            {
                "code":"CAR_GOODS",
                "msg":"汽车用品"
            },
            {
                "code":"PARTS",
                "msg":"配件"
            },
            {
                "code":"SERVICE_PRODUCT",
                "msg":"服务产品"
            },
            {
                "code":"SAAS_APP",
                "msg":"SaaS应用"
            },
            {
                "code":"SMART_STORE",
                "msg":"智能存储"
            }
        ],
        "USER_TAGS":[
            {
                "code":"FREQUENT_PURCHASE",
                "msg":"购买频繁"
            },
            {
                "code":"SMART_HOME_USER",
                "msg":"xx家居用户"
            },
            {
                "code":"MONITOR_USER",
                "msg":"xx专业户"
            },
            {
                "code":"NO_DEVICE",
                "msg":"无设备用户"
            },
            {
                "code":"INSTABLE_DEVICE",
                "msg":"设备不稳定"
            },
            {
                "code":"HIGH_ACTIVITY",
                "msg":"活跃度高"
            },
            {
                "code":"HIGH_CONSUME",
                "msg":"高消费能力"
            },
            {
                "code":"HOME_USER",
                "msg":"家庭用户"
            },
            {
                "code":"ENTERPRISE_USER",
                "msg":"企业用户"
            }
        ],
        "COMMUNICATE_INTENTION":[
            {
                "code":"HAVE_INTENTION",
                "msg":"有意向"
            },
            {
                "code":"NO_COMMUNICATE",
                "msg":"没有沟通过"
            },
            {
                "code":"NON_INTENTION",
                "msg":"无意向"
            },
            {
                "code":"GET_DEAL",
                "msg":"达成购买"
            }
        ]
}
阅读 2.6k
4 个回答

补充一下,名称风格转换可以用 name-styles 库,这个示例就写简单点

const nameSytles = require("name-styles");
const { camel } = nameSytles;

console.log(Object.keys(data)
    .map(key => camel(key)));

结果

[ 'cloudService',
  'haveProduct',
  'userTags',
  'communicateIntention' ]

下面是关于数据转换的处理


const result = Object.entries(data)
    .map(([key, list]) => ({
        key,
        codes: list.map(t => t.code)
    }))
    .reduce((acc, item) => {
        acc[item.key] = item.codes;
        return acc;
    }, {});

console.log(result);

结果

{ CLOUD_SERVICE:
   [ 'CLOUD_STORE',
     'FACE_RECS',
     'WARN_CALL',
     'HUMAN_CHECK',
     'SERVICE_NEARLY_EXP' ],
  HAVE_PRODUCT:
   [ 'CAMERA',
     'SMART_LOCK',
     'CAT_EYE',
     'SUIT',
     'SMART_CURTAIN',
     'HW_VIDEO_RECORDER',
     'SENSE_WARN',
     'CHILD_MACHINE',
     'DRIVE_RECORDER',
     'SPORT_CAMERA',
     'NETWORK',
     'CAR_GOODS',
     'PARTS',
     'SERVICE_PRODUCT',
     'SAAS_APP',
     'SMART_STORE' ],
  USER_TAGS:
   [ 'FREQUENT_PURCHASE',
     'SMART_HOME_USER',
     'MONITOR_USER',
     'NO_DEVICE',
     'INSTABLE_DEVICE',
     'HIGH_ACTIVITY',
     'HIGH_CONSUME',
     'HOME_USER',
     'ENTERPRISE_USER' ],
  COMMUNICATE_INTENTION:
   [ 'HAVE_INTENTION',
     'NO_COMMUNICATE',
     'NON_INTENTION',
     'GET_DEAL' ] }

像FREQUENT_PURCHASE这样的串,首先你要获取到它是data中的哪一类。
可以遍历一遍data生成一个映射表typeMap:

{
  CLOUD_STORE: 'CLOUD_SERVICE',
  FACE_RECS: 'CLOUD_SERVICE',
  CAMERA: 'HAVE_PRODUCT',
  // ... 
}

你想要的selected,可以先初始化:

let targetSelected = {
  userTag: [],
  communicationIntention: [],
  // ...
}

这里有个小问题是targetSelected与data中的键不一致,但是一一对应,所以你要么写个函数,要么写个映射表,可以根据data中的key得到targetSelected中的key:

function getKey(src) {
  if (src == 'CLOUD_SERVICE') return 'cloudServices'
  // ...
}

这样,对于后端返回的数组selected中的每一项,分发到targetSelected即可。

selected.forEach(type => {
  let key = typeMap[type]
  targetSelected[getKey(src)].push(type)
})

其实很简单,但最好的方式后端直接返回规范的数据,如果实在不行再用上面的办法。

原数据有点太简洁了
data={

arr:["name1","name2","name3"]

}
变成
arr:[{"code":"name1","msg":"1"},{"code":"name2","msg":2},{"code":"name3","msg":3},];
如果是这样得话
var new=[];
data.arr.forEach((item,index)=>{

var obj={};
obj.code=item;
obj.msg=index+1;
new.push(obj);

})

总结一下

const typeMap = Object.entries(this.objectFields).map(([key, list]) => ({
          key,
          codes: list.map(t => t.code),
        })).reduce((acc, item) => {
          item.codes.forEach((t) => {
            acc[t] = item.key;
          });
          return acc;
        }, {});
        selected.forEach((type) => {
          const key = typeMap[type];
          this.formData[this.getKey(key)].push(type);
        });
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题