1、Object.keys遍历(forEach/map)对象数组合并
开发中的实际应用(原文:segmentfault.com/a/119000001…
需求:将如下两个从后台不同端口获取的json对象数组整合处理成如下注释部分的json对象
var goodsList = [{
"SpecA": "颜色"
}, {
"SpecB": "容量"
}, {
"SpecC": "大小"
}, {
"SpecD": "尺寸"
}, {
"SpecE": "套餐"
},{
"goodsId":"商品Id"
}];
var goodsInfo = [{
c_id: 3133,
costPrice: 0,
discountPrice: 0,
earn: 0,
etime: null,
flag: 0,
goodsDetailCount: 199,
goodsDetailId: "100PgQ2xy08121409mY24",
goodsDetailInventory: 199,
goodsDetailOff: 0,
goodsDetailPrice: 188,
goodsDetailSpec: "",
goodsId: "00Y1kR4r1029X822731",
isHost: 0,
managerEarn: 0,
postage: 10,
profit: 0,
specA: "红色",
specB: "32G",
specC: "小",
specD: "4.7寸",
specE: "套餐一",
unionEarn: 0,
vipPrice: 0
}, {
c_id: 3134,
costPrice: 0,
discountPrice: 0,
earn: 0,
etime: null,
flag: 0,
goodsDetailCount: 199,
goodsDetailId: "100PgQ2xy08121409mY25",
goodsDetailInventory: 199,
goodsDetailOff: 0,
goodsDetailPrice: 188,
goodsDetailSpec: "",
goodsId: "00Y1kR4r1029X822732",
isHost: 0,
managerEarn: 0,
postage: 10,
profit: 0,
specA: "白色",
specB: "64G",
specC: "小",
specD: "5寸",
specE: "套餐二",
unionEarn: 0,
vipPrice: 0
}, {
c_id: 3135,
costPrice: 0,
discountPrice: 0,
earn: 0,
etime: null,
flag: 0,
goodsDetailCount: 199,
goodsDetailId: "100PgQ2xy08121409mY26",
goodsDetailInventory: 199,
goodsDetailOff: 0,
goodsDetailPrice: 188,
goodsDetailSpec: "",
goodsId: "00Y1kR4r1029X822733",
isHost: 0,
managerEarn: 0,
postage: 10,
profit: 0,
specA: "黑色",
specB: "128G",
specC: "小",
specD: "4.7寸",
specE: "套餐一",
unionEarn: 0,
vipPrice: 0
}, {
c_id: 3136,
costPrice: 0,
discountPrice: 0,
earn: 0,
etime: null,
flag: 0,
goodsDetailCount: 199,
goodsDetailId: "100PgQ2xy08121409mY27",
goodsDetailInventory: 199,
goodsDetailOff: 0,
goodsDetailPrice: 188,
goodsDetailSpec: "",
goodsId: "00Y1kR4r1029X822734",
isHost: 0,
managerEarn: 0,
postage: 10,
profit: 0,
specA: "蓝色",
specB: "64GG",
specC: "大",
specD: "4.5寸",
specE: "套餐二",
unionEarn: 0,
vipPrice: 0
}];
/**
var keys = {
'颜色': ['红色', '白色'],
'容量': ['8g', '16g', '32g', '64g'],
'尺寸': ['大', '小', '大'],
'套餐': ['套餐一', '套餐二', '套餐三']
};
var sku_list = [{
'attrs': '红色|16g|big|套餐二',
'price': 120
}, {
'attrs': '红色|8g|big|套餐一',
'price': 10
}, {
'attrs': '白色|16g|big|套餐二',
'price': 28
}];
*/
实现:主要利用Object.keys方法获取对象的key,value值,配上forEach循环实现最终想要的结果。
//代码分2部分,1生成key集合 2、生成库存list
var keyParam = {}; //存放key的新对象
var sku_list = [];
//原数据首字母转换小写 ,为了匹配接口的数据
goodsList = goodsList.map(function (item){
var key = Object.keys(item)[0] //["SpacA"][0] =>SpacA
var newKey = key.substring(0,1).toLowerCase()+key.substring(1); //截取s+paceA
var param = {}
param[newKey] = item[key]
return param
})
//生成keys
goodsList.forEach(function (item) {
var key = Object.keys(item)[0]; //['specA']
var val = item[key]; //颜色
if (!keyParam.hasOwnProperty(val)) { //判断自身属性是否存在
keyParam[val] = [];
}
var hash = {};
goodsInfo.forEach(function (t, i) {
if (hash[t[key]] === undefined) {
hash[t[key]] = true;
keyParam[val].push(t[key]);
}
// if (keys[val].indexOf(item[key]) === -1) {
// keys[val].push(item[key]);
// }
});
});
//生成sku_list
goodsInfo.forEach(function (item) {
var dic = {
attrs: ''
};
goodsList.forEach(function (t, j) {
var key = Object.keys(t)[0];
dic.attrs += item[key] + (j === goodsList.length - 1 ? '' : '|');
dic.price = item.goodsDetailPrice;
dic.goodsDetailCount = item.goodsDetailCount;
dic.goodsDetailId = item.goodsDetailId;
});
sku_list.push(dic);
});
console.log('sku_list=',sku_list)
2、数组数据拆分重组转成嵌套对象
// 求数组转换成json
//['codeZh', 'codeCn', 'taobao.cn', 'taobao.com']
// 输出
/*
{
'code':{Zh:'codeZh',Cn:'codeCn'},
'taobao':{'.cn':'taobao.cn},'.com':'taobao.com'
}
*/
const resultObj = {};
let arr = ['codeZh', 'codeCn', 'taobao.cn', 'taobao.com'];
// 数组拆分'code', 'Zh'匹配根据大写和后缀·
let arrSplit = arr.map(item => (item.indexOf('.') !== -1 ? item.replace(/(\.)/g, ",$1").split(',') : item.replace(/([A-Z])+/g, ",$1").split(',')))
//输出构建对象数据0,1,1+0组合
let arrGroup = arrSplit.map(item => ({
[item[0]]: { [item[1]]: item.join('') }
}))
//方法1:实现符合的JSON
for (let i = 0; i < arrGroup.length; i++){
for (const [key, value] of Object.entries(arrGroup[i])) {
resultObj[key] = {
...resultObj[key],
...value
}
}
}
//方法2:实现符合的JSON
arrGroup.map((x, i) => {
const k = Object.keys(x);
resultObj[k] = Object.assign({},resultObj[k],x[k]);
return x[k];
});
//console.log(arrSplit);
// console.log(arrGroup);
//console.log(resultObj);