Object.keys遍历对象数组

1,225 阅读3分钟

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