我的数据结构如下:
let siteLists = [
{
"data": {
"client_id": 29
},
"all_branch": 1,
"value": 29,
"label": "A Site"
},
{
"data": {
"client_id": 23,
},
"all_branch": 0,
"value": 91,
"label": "B-1 Site"
},
{
"data": {
"client_id": 23,
},
"all_branch": 0,
"value": 86,
"label": "B-2 Site"
},
{
"data": {
"client_id": 10
},
"all_branch": 1,
"value": 10,
"label": "C Site"
}
];
提示:我需要在一个对象中具有相同data.client_id值的concat对象包含由那些相同data.client_id的值填充的分支。将结果转换成这样
[
{
id: 29,
branches: [],
all_branch:1
},
{
id: 23,
branches: [91,86],
all_branch:0
},
{
id: 10,
branches: [],
all_branch:1
}
]
我会尝试这样的代码:
let populate = [...siteLists.map(item => {
return item.all_branch===1 ?
{all_placement: 1, placement_id:item.data.client_id, branch_id:[]} :
{all_placement: 0,placement_id:item.data.client_id, branch_id:[item.value]}
})];
但是结果不适合我需要
这应该可行,虽然可能不是最佳选择。我还自由地将值添加到branchs数组,而不是将其保留为空。
let siteLists = [{
"data": {
"client_id": 29
},
"all_branch": 1,
"value": 29,
"label": "A Site"
},
{
"data": {
"client_id": 23,
},
"all_branch": 0,
"value": 91,
"label": "B-1 Site"
},
{
"data": {
"client_id": 23,
},
"all_branch": 0,
"value": 86,
"label": "B-2 Site"
},
{
"data": {
"client_id": 10
},
"all_branch": 1,
"value": 10,
"label": "C Site"
}
];
var resultarray = []; //expected result
var branchId = []; //stores an object to map the branch ID and the array index to keep track of duplicate IDs
var count = 0; //keeps track of the current array Index
siteLists.forEach(element => { //for loop to loop through siteList array
var resultObj = new Object(); //stores the temporary result Object
var id = element.data.client_id;
var status = false; //keeps track of if it is a duplicate ID
if (count != 0) {
branchId.forEach(obj => { //for loop to check for duplicate ID (will only run after the first iteration of result loop)
if (obj.id === id) { //checks if the ID matches
var index = obj.index;
var value = element.value;
resultarray[index].branches.push(value); //Pushes value to branches array if ID is duplicate
status = true;
}
})
}
if (status == false) {
var branchObj = {
'id': id,
'index': count
}
var allBranch = element.all_branch;
//var value = element.value; //uncomment if you need value in the resultObj when id does not match
branchId.push(branchObj);
resultObj.id = id;
resultObj.branches = [];
//resultObj.branches.push(value);//uncomment if you need value in the resultObj when id does not match
resultObj.branches.push([]);
resultObj.all_branch = allBranch;
resultarray.push(resultObj);
count = count + 1;
} else {
status = false;
}
})
console.log(resultarray);
根据您的要求,这很好。我们在format函数内部使用了一个临时哈希图,该哈希图处理输入数据数组并返回输出。
let siteLists = [
{
"data": {
"client_id": 29
},
"all_branch": 1,
"value": 29,
"label": "A Site"
},
{
"data": {
"client_id": 23,
},
"all_branch": 0,
"value": 91,
"label": "B-1 Site"
},
{
"data": {
"client_id": 23,
},
"all_branch": 0,
"value": 86,
"label": "B-2 Site"
},
{
"data": {
"client_id": 10
},
"all_branch": 1,
"value": 10,
"label": "C Site"
}
];
function format(data = []) {
const hashMap = {};
const result = [];
let resIndex = 0;
data.forEach(thisData => {
if (hashMap[thisData.data.client_id]) {
result[hashMap[thisData.data.client_id]].branches.push(thisData.data.client_id);
} else {
hashMap[thisData.data.client_id] = resIndex++;
result.push({
id: thisData.data.client_id,
branches: [thisData.value],
all_branch: thisData.all_branch
});
}
});
return result;
}
console.log(format(siteLists));