将图一的json转化为图二的形式,也就是在相同的id时,将keyIds拼接到一起。本人写了个呆呆的且不严谨的方法。
//一维数组去重
var arr = []
for(var i = 0 ; i< questionParams.length; i++){
arr.push(questionParams[i].id)
}
//将多选的选项添加进去
var Ids = [];
for( var j in dedupe(arr)){
for(var i = 0 ; i< questionParams.length; i++){
if( questionParams[i].id == dedupe(arr)[j]){
Ids.push(questionParams[i].keyIds);
questionParams[i].keyIds = Ids.join(",")
}
}
Ids = [];
}
questionParams = questionParams.reverse()
var temp = {};//用于id判断重复
var result = [];//最后的新数组
//将数组倒序排放,遍历数组,将每个item.id在temp中是否存在值做判断,
//如不存在则对应的item赋值给新数组,并将temp中item.id对应的key赋值,
//下次对相同值做判断时便不会走此分支,达到判断重复值的目的;
questionParams.map(function(item,index){
if(!temp[item.id]){
result.push(item);
temp[item.id] = true
}
})
questionParams = result.reverse()
大佬给我写了个简单的方法。
var temp = {}; // 定义一个空对象
var w = questionParams; // 取得要遍历的数据
w.forEach(function(item){ // forEach循环遍历,item是数组元素
var skey = item.id + item.describe; // 取的元素不需要合并的数据,作为对象的key,利用他的唯一性,求的对应的value
if(typeof temp[skey] == 'undefined'){ // 如果temp对应的对象key不存在
temp[skey] = item; // 首次给 该 key 赋值上对应的value
}else {
// 如果存在,先把存在key 对应的value转化为字符串.判断是否已经合并,如果已经合并,结束
if(temp[skey]['keyIds'].toString().indexOf(item['keyIds']) == -1){
var v = [temp[skey]['keyIds'],item['keyIds']]; // 放在一个数组里
temp[skey]['keyIds'] = v.join(",") // 转化为字符串
}
}
})
var result = [];
for ( var i in temp){ // 遍历得到的temp对象
result.push(temp[i]);
}
console.log(result)
三年啊,要继续加油啊。