0

I want to take each array from the 'data' array and create 3 different objects from it. Before creating those objects I want to check if the object that I want to create is not already in the 'dataArr' array. If the object with specific key is found in the 'dataArr', then push the current array of 'data' to that object's value, else create the new object and then push it to the 'dataArr'.

Now if I found that the object with specific key exists in the 'dataArr', and try to push the current array to it, I get it pushed to all existing objects in the 'dataArr'. Why this is happening?

Here is my code:

  let data = [
['Company1', '123456', 'Manager1', '111'],
['Company2', '789123', 'Manager2', '222'],
['Company3', '456789', 'Manager3', '222'],
['Company4', '456789', 'Manager4', '222'],
['Company5', '789456', 'Manager4', '222']
  ];

  let table = [
['111', 'Name1', 'NameA'],
['222', 'Name2', 'NameA'],
['333', 'Name3', 'NameB']
  ];

  let dataArr = [];
  
  for (let i = 0; i < data.length; i++) {
let manager = data[i][2].toString().trim();
let opCode = data[i][3].toString().trim();
let dataObj = {};
let value = [];
let valueAdded = false;

let tName1;
let tName2;

for (let j = 0; j < table.length; j++) {
  let code = table[j][0];
  if (code === opCode) {
    tName1 = table[j][1];
    tName2 = table[j][2];
    break;
  }
}

for (let k = 0; k < dataArr.length; k++) {
  let obj = dataArr[k];
  let objKey = Object.keys(obj)[0]; // Object will always has only one key-value pair.
  
  if (objKey == manager || objKey == tName1 || objKey == tName2) {
    let objValue = obj[objKey];
    
    obj[objKey].push(data[i]); // Object's value is 2D array [[]].
    valueAdded = true;
    break;
  } 
}

// If the object with the key isn't found in the dataArr.
if (!valueAdded) {
  value.push(data[i]);
  dataObj[manager] = value;
  dataArr.push(dataObj);
  
  if (tName1 != manager) {
    dataObj = {};
    dataObj[tName1] = value;
    dataArr.push(dataObj);
  }
  
  if (tName2 != manager && tName2 != tName1) {
    dataObj = {};
    dataObj[tName2] = value;
    dataArr.push(dataObj);
    valueAdded = true;
  }
}
  }
  
  dataArr.forEach(item => console.log(item));

The result that I get:

{ Manager1: 
   [ [ 'Company1', '123456', 'Manager1', '111' ],
     [ 'Company2', '789123', 'Manager2', '222' ],
     [ 'Company3', '456789', 'Manager3', '222' ],
     [ 'Company4', '456789', 'Manager4', '222' ],
     [ 'Company5', '789456', 'Manager4', '222' ] ] }

{ Name1: 
   [ [ 'Company1', '123456', 'Manager1', '111' ],
     [ 'Company2', '789123', 'Manager2', '222' ],
     [ 'Company3', '456789', 'Manager3', '222' ],
     [ 'Company4', '456789', 'Manager4', '222' ],
     [ 'Company5', '789456', 'Manager4', '222' ] ] }

{ NameA: 
   [ [ 'Company1', '123456', 'Manager1', '111' ],
     [ 'Company2', '789123', 'Manager2', '222' ],
     [ 'Company3', '456789', 'Manager3', '222' ],
     [ 'Company4', '456789', 'Manager4', '222' ],
     [ 'Company5', '789456', 'Manager4', '222' ] ] }

But what I actually need is this:

{ Manager1: 
   [ [ 'Company1', '123456', 'Manager1', '111' ] ] }

{ Name1: 
   [ [ 'Company1', '123456', 'Manager1', '111' ] ] }

{ NameA: 
   [ [ 'Company1', '123456', 'Manager1', '111' ],
     ['Company2', '789123', 'Manager2', '222'],
     ['Company3', '456789', 'Manager3', '222'],
     ['Company4', '456789', 'Manager4', '222'],
     ['Company5', '789456', 'Manager4', '222'] ] }

{ Manager2: 
   [ ['Company2', '789123', 'Manager2', '222'] ] }

{ Name2: 
   [ ['Company2', '789123', 'Manager2', '222'],
     ['Company3', '456789', 'Manager3', '222'],
     ['Company4', '456789', 'Manager4', '222'],
     ['Company5', '789456', 'Manager4', '222'] ] }

{ Manager3: 
   [ ['Company3', '456789', 'Manager3', '222'] ] }

{ Manager4: 
   [ ['Company4', '456789', 'Manager4', '222'] }

{ Manager5: 
   [ ['Company5', '789456', 'Manager4', '222'] }

How can I achieve this?

TheMaster
  • 45,448
  • 6
  • 62
  • 85
Mykolas
  • 11
  • 2
  • I'm confused. What is data and what is table? Is one client list and the other agents? You've said you want to create 3 objects, yet in your "need" there are 8... If you can clarify, I can take a look again. – iAmOren Jul 07 '20 at 11:09
  • @iAmOren 'data' is Google Sheets data where each row is represented as an array, and yes it's very similar to the client list. 'table' contains names associated with key. So I want to take an array from 'data', look-up names by the code (e.g. '111') in 'table', assign those names to variables and use them as keys then creating new objects. And yes, I want to create 3 objects from one array of 'data', but only if the object doesn't exist in the 'dataArr'. – Mykolas Jul 07 '20 at 12:08
  • So, why are there 8 objects in **But what I actually need is this:**? – TheMaster Jul 07 '20 at 13:12
  • Does this answer your question? [Copy array by value](https://stackoverflow.com/questions/7486085/copy-array-by-value) – TheMaster Jul 07 '20 at 13:13
  • I still don't understand what you are trying to achieve. – iAmOren Jul 07 '20 at 13:21
  • Please format you code properly. It doesn't seem to be correct. That last forEach doesn't seem to be contained with in the rest of the function.. – Cooper Jul 07 '20 at 16:02

1 Answers1

1

Please the possible and improved solution for this.

  let data = [
['Company1', '123456', 'Manager1', '111'],
['Company2', '789123', 'Manager2', '222'],
['Company3', '456789', 'Manager3', '222'],
['Company4', '456789', 'Manager4', '222'],
['Company5', '789456', 'Manager5', '222']
  ];

  let table = [
['111', 'Name1', 'NameA'],
['222', 'Name2', 'NameA'],
['333', 'Name3', 'NameB']
  ];

  let dataArr = [];


  let addObject = function (keyName, dataToAdd, dataArr){
    //console.log(keyName);
     let myObj= dataArr.filter((obj) => {
        return Object.keys(obj)[0] == keyName;
      });
    if(myObj && myObj.length > 0){
      myObj[0][keyName].push(dataToAdd);
    }
    else{
      let obj= {};
      obj[keyName] = [];
      obj[keyName].push(dataToAdd);
       dataArr.push(obj)
    }
  }

  for(let i = 0; i < data.length; i++){
    var keyName = data[i][2];
    addObject(keyName, data[i], dataArr);
    for(let j = 0; j < table.length; j++){
     if(table[j][0] == data[i][3]){
       addObject(table[j][1], data[i], dataArr);
          addObject(table[j][2], data[i], dataArr);
     }
    }
  }
  
 dataArr.forEach(item => console.log(item));

working code is here:- https://stackblitz.com/edit/typescript-vbkaub