Reputation: 15
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
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
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
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
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