HyoD.k
HyoD.k

Reputation: 15

JavaScript two array in object deduplication

I want to eliminate duplicate data by comparing two information in two arrays.

const dataList = [
  { id: 1, name: "Kim", workcenterId: "workcenter0001", processId: "process0001" },
  { id: 2, name: "Lee", workcenterId: "workcenter0002", processId: "process0002" },
  { id: 3, name: "ji",  workcenterId: "workcenter0003", processId: "process0003" },
  { id: 4, name: "cho", workcenterId: "workcenter0004", processId: "process0004" },
];
const paramsList = [
  { id: 5, name: "kaka", workcenterId: "workcenter0001", processId: "process0001" },
  { id: 6, name: "eses", workcenterId: "workcenter0002", processId: "process0002" },
];

let result = [];
for (let i = 0; i < dataList.length; i++) {
  result.push(dataList[i]);
  for (let j = 0; j < paramsList.length; j++) {
    if (dataList[i].workcenterId === paramsList[j].workcenterId &&
        dataList[i].processId === paramsList[j].processId) {
      result.pop();
      break;
    }
  }
}

My code many many not clean code..

I want a clean code.

I want short code.

sorry I ran the translator. I'm curious about your clean code.

Upvotes: 0

Views: 1145

Answers (4)

Md Sabbir Alam
Md Sabbir Alam

Reputation: 5054

You can use reduce to do that in a more cleaner way.

const dataList = [
  { id: 1, name: "Kim", workcenterId: "workcenter0001", processId: "process0001" },
  { id: 2, name: "Lee", workcenterId: "workcenter0002", processId: "process0002" },
  { id: 3, name: "ji",  workcenterId: "workcenter0003", processId: "process0003" },
  { id: 4, name: "cho", workcenterId: "workcenter0004", processId: "process0004" },
];
const paramsList = [
  { id: 5, name: "kaka", workcenterId: "workcenter0001", processId: "process0001" },
  { id: 6, name: "eses", workcenterId: "workcenter0002", processId: "process0002" },
];

const result = dataList.reduce((acc, curr) => {
   const index = paramsList.findIndex(item => item.workcenterId === curr.workcenterId && item.processId === curr.processId);
   index === -1 && acc.push(curr);
   return acc;
}, []);

console.log(result);

Upvotes: 0

Mr. Polywhirl
Mr. Polywhirl

Reputation: 48600

You can find the difference of the two lists by first figuring out how you want to serialize your data. Once you figure that out, you can use that function to cache your items for set comparison.

const difference = (src, ref, serializeFn) =>
  (cache => src.filter(item =>
    !cache.has(serializeFn(item))))
  (new Set(paramsList.map(item => serializeFn(item))));

const serializeFn = ({id, name, workcenterId, processId }) =>
  JSON.stringify({id, name, workcenterId, processId });

const dataList = [
  { id: 1, name: "Kim", workcenterId: "workcenter0001", processId: "processId" },
  { id: 2, name: "Lee", workcenterId: "workcenter0002", processId: "processId" },
  { id: 3, name: "ji",  workcenterId: "workcenter0003", processId: "processId" },
  { id: 4, name: "cho", workcenterId: "workcenter0004", processId: "processId" },
];
const paramsList = [
  { id: 1, name: "Kim", workcenterId: "workcenter0001", processId: "processId" },
  { id: 2, name: "Lee", workcenterId: "workcenter0002", processId: "processId" },
];

console.log(difference(dataList, paramsList, serializeFn));
.as-console-wrapper { top: 0; max-height: 100% !important; }

Upvotes: 0

Prime
Prime

Reputation: 2849

You can use Array.some and Array.filter to get final result you want.

    const dataList = [
      { id: 1, name: "Kim", workcenterId: "workcenter0001", processId: "process0001" },
      { id: 2, name: "Lee", workcenterId: "workcenter0002", processId: "process0002" },
      { id: 3, name: "ji",  workcenterId: "workcenter0003", processId: "process0003" },
      { id: 4, name: "cho", workcenterId: "workcenter0004", processId: "process0004" },
    ];
    const paramsList = [
      { id: 5, name: "kaka", workcenterId: "workcenter0001", processId: "process0001" },
      { id: 6, name: "eses", workcenterId: "workcenter0002", processId: "process0002" },
    ];
    const result = dataList.filter(dataItem => {
      return !paramsList.some(paramsItem => paramsItem.processId === dataItem.processId && paramsItem.workcenterId === dataItem.workcenterId)
    });
    console.log(result);

Upvotes: 1

Thomas
Thomas

Reputation: 12637

const dataList = [
  { id: 1, name: "Kim", workcenterId: "workcenter0001", processId: "process0001" },
  { id: 2, name: "Lee", workcenterId: "workcenter0002", processId: "process0002" },
  { id: 3, name: "ji",  workcenterId: "workcenter0003", processId: "process0003" },
  { id: 4, name: "cho", workcenterId: "workcenter0004", processId: "process0004" },
];
const paramsList = [
  { id: 5, name: "kaka", workcenterId: "workcenter0001", processId: "process0001" },
  { id: 6, name: "eses", workcenterId: "workcenter0002", processId: "process0002" },
];

let result = dataList.filter(item => {
  return !paramsList.some(other => other.workcenterId === item.workcenterId 
    && other.processId === item.processId)
});

console.log(result);

or another approach:

const dataList = [
  { id: 1, name: "Kim", workcenterId: "workcenter0001", processId: "process0001" },
  { id: 2, name: "Lee", workcenterId: "workcenter0002", processId: "process0002" },
  { id: 3, name: "ji",  workcenterId: "workcenter0003", processId: "process0003" },
  { id: 4, name: "cho", workcenterId: "workcenter0004", processId: "process0004" },
];
const paramsList = [
  { id: 5, name: "kaka", workcenterId: "workcenter0001", processId: "process0001" },
  { id: 6, name: "eses", workcenterId: "workcenter0002", processId: "process0002" },
];

const keysToRemove = new Set(paramsList.map(({workcenterId, processId}) => `${workcenterId};${processId}`));
let result = dataList.filter(({workcenterId, processId}) => !keysToRemove.has(`${workcenterId};${processId}`));

console.log(result);

Upvotes: 0

Related Questions