将对象内的相同ID与一个对象数组相联系

问题描述 投票:-1回答:2

我的数据结构如下:

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

但是结果不适合我需要

javascript arrays object concat reduce
2个回答
1
投票

这应该可行,虽然可能不是最佳选择。我还自由地将值添加到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);

0
投票

根据您的要求,这很好。我们在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));
© www.soinside.com 2019 - 2024. All rights reserved.