8 Phương pháp So Sánh Mảng trong JavaScript

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()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()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_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.keysObject.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}}

Thẻ: JavaScript array object filter map

Đăng vào ngày 24 tháng 6 lúc 20:06