1. So sánh hai mảng đối tượng, xóa các mục trùng lặp và hợp nhất các đối tượng dựa trên thuộc tính
Chúng ta cần so sánh hai mảng đối tượng khác nhau và hợp nhất chúng nếu các thuộc tính cụ thể khớp. Sử dụng phương thức filter() để thực hiện điều này.
let array1 = [
{ id: "50", value: 10 },
{ id: "51", value: 11 }
];
let array2 = [
{ id: "53", value: 10 },
{ id: "51", value: 11 },
{ id: "52", value: 13 }
];
let res = array2.filter(val =>
array1.some(({ value }) => val.value === value)
);
console.log("1", JSON.stringify(res));
// [{"id":"53","value":10},{"id":"51","value":11}]
2. So sánh hai mảng đối tượng, hợp nhất và cập nhật giá trị (giả sử mảng 3, 4 chia sẻ cùng một ID)
Sử dụng map() để tạo một mảng mới của các đối tượng và find() để tìm kiếm và cập nhật giá trị mới.
let array3 = [
{ id: "50", value: 12 },
{ id: "51", value: 15 }
];
let array4 = [
{ id: "50", value: 10 },
{ id: "51", value: 11 },
{ id: "52", value: 13 }
];
let arr = array3.map(id => ({
id: id.id,
newValue: array4.find(o => o.id === id.id).value + 2
}));
console.log("2", JSON.stringify(arr));
// [{"id":"50","newValue":12},{"id":"51","newValue":13}]
3. So sánh mảng đối tượng và tìm các đối tượng duy nhất
Sử dụng filter() để so sánh hai mảng đối tượng và kiểm tra các đối tượng duy nhất.
const array5 = [
{ key: 1, value: 12 },
{ key: 2, value: 15 }
];
const array6 = [
{ key: 1, value: 12 },
{ key: 2, value: 15 },
{ key: 3, value: 13 }
];
const ids = array5.map(e => e.key);
let filtered = array6.filter(e => ids.includes(e.key));
console.log("3", JSON.stringify(filtered));
// [{"key":1,"value":12},{"key":2,"value":15}]
4. So sánh và cập nhật thuộc tính theo giá trị khớp
Sử dụng map() và Set để so sánh hai mảng đối tượng và cập nhật thuộc tính dựa trên giá trị khớp.
const array7 = [
{ id: "50", value: 12 },
{ id: "51", value: 15 }
];
const array8 = [{ id: "50", value: 12 }];
const idSet = new Set(array8.map(o => o.id));
const res1 = array7.map(o => ({ ...o, value: idSet.has(o.id) ? "0" : o.value }));
console.log("4", JSON.stringify(res1));
// [{"id":"50","value":"0"},{"id":"51","value":15}]
5. So sánh hai mảng đối tượng và lấy sự khác biệt
Sử dụng reduce() và filter() để so sánh hai mảng đối tượng và lấy sự khác biệt giữa chúng.
let a = [
{ id: "50", sysNo: 10 },
{ id: "51", sysNo: 11 }
];
let b = [
{ id: "50", sysNo: 10 },
{ id: "51", sysNo: 11 },
{ id: "52", sysNo: 13 }
];
let valuesArray1 = a.reduce((acc, c) => (acc[c.sysNo] = c.sysNo, acc), {});
let valuesArray2 = b.reduce((acc, c) => (acc[c.sysNo] = c.sysNo, acc), {});
let result = a
.filter(c => !valuesArray2[c.sysNo])
.concat(b.filter(c => !valuesArray1[c.sysNo]));
console.log("5", result);
// [{"id":"52","sysNo":13}]
let ab = b.filter(o => !a.find(o2 => o.id === o2.id));
console.log("6", ab);
6. So sánh hai mảng đối tượng, hợp nhất và xóa các mục trùng lặp
Sử dụng Set để so sánh hai mảng đối tượng, hợp nhất và xóa các mục trùng lặp.
let arr1 = [
{ id: "1", value: 10 },
{ id: "2", value: 11 }
];
let arr2 = [
{ id: "1", value: 10 },
{ id: "2", value: 11 },
{ id: "3", value: 13 }
];
const arr1IDs = new Set(arr1.map(({ id }) => id));
const combined = [...arr1, ...arr2.filter(({ id }) => !arr1IDs.has(id))];
console.log(JSON.stringify(combined));
// [{"id":"1","value":10},{"id":"2","value":11},{"id":"3","value":13}]
7. Sử dụng Lodash
Lodash cung cấp các phương thức _differenceBy và _differenceWith để tìm sự khác biệt giữa hai mảng.
let lodashtest1 = [{ key: "1" }, { key: "2" }];
let lodashtest2 = [{ key: "1" }, { key: "2" }, { key: "3" }];
let lodashresult = _.differenceBy(lodashtest2, lodashtest1, "key");
console.log("7", JSON.stringify(lodashresult));
// [{"key":"3"}]
let dif = _.differenceWith(lodashtest2, lodashtest1, _.isEqual);
console.log("8", JSON.stringify(dif));
// [{"key":"3"}]
8. So sánh đối tượng và tìm các giá trị duy nhất
Sử dụng Object.keys và Object.values để so sánh hai đối tượng lồng nhau và tìm các giá trị duy nhất.
let obj1 = {
val1: "test",
stream: { prop1: false, prop2: true }
};
let obj2 = {
val1: "test",
stream: { prop1: true, prop2: true }
};
interface Data {
stream: { [key: string]: boolean };
}
function objFilter(objA: Data, objB: Data): Data {
let out: Data = { stream: {} };
Object.keys(objA.stream).forEach(key => {
if (objA.stream[key] === objB.stream[key]) {
out.stream[key] = objA.stream[key];
}
});
return out;
}
console.log(JSON.stringify(objFilter(obj1, obj2)));
// {"stream":{"prop2":true}}