Skip to main content
deleted 16 characters in body
Source Link
Nina Scholz
  • 387.9k
  • 26
  • 367
  • 417
function merge(a, b, entries, final, index = 0) {
    var [k, v] = entries[index];
    return b.reduce((r, o) => {
        var temp = r.find(q => o[k] === q[k]);
        if (!temp) {
            r.push(o);
        } else if (index + 1 === entries.length) {
            temp[v] = final(temp[v], o[v]);
        } else {
            merge(temp[v], o[v], entries, final, index + 1);
        }                
        return r;
    }, a);
}

var filters1 = { categories: [{ categoryName: "Video", categoryAttributes: [{ name: "aspectRatio", values: ["4:3", "16:15"] }, { name: "Bit Rate", values: ["256kbps", "512kbps"] }] }, { categoryName: "Audio", categoryAttributes: [{ name: "Speaker", values: ["In-built", "External Connector"] }, { name: "Bit Rate", values: ["256kbps", "376kbps", "512kbps"] }] }] },
    filters2 = { categories: [{ categoryName: "Video", categoryAttributes: [{ name: "aspectRatio", values: ["4:3", "16:15", "16:9"] }, { name: "Bit Rate", values: ["256kbps", "512kbps", "1024kbps"] }] }, { categoryName: "Audio", categoryAttributes: [{ name: "Speaker", values: ["In-built", "External Connector"] }, { name: "Bit Rate", values: ["256kbps", "376kbps", "512kbps", "1024kbps"] }] }, { categoryName: "OS", categoryAttributes: [{ name: "Android", values: ["Lolipop", "Marshmello"] }, { name: "Apple", values: ["IOS 5", "IOS 6"] }] }] },
    parts = [
        [undefined, 'categories'],
        ['categoryName', 'categoryAttributes'],
        ['name', 'values']
    ],
    fn = (a, b) => [...new Set([...a, ...b])],
    categoriesresult = merge(filters1.categories[filters1], filters2.categories[filters2], parts, fn),
    result = { categories };

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
function merge(a, b, entries, final, index = 0) {
    var [k, v] = entries[index];
    return b.reduce((r, o) => {
        var temp = r.find(q => o[k] === q[k]);
        if (!temp) {
            r.push(o);
        } else if (index + 1 === entries.length) {
            temp[v] = final(temp[v], o[v]);
        } else {
            merge(temp[v], o[v], entries, final, index + 1);
        }                
        return r;
    }, a);
}

var filters1 = { categories: [{ categoryName: "Video", categoryAttributes: [{ name: "aspectRatio", values: ["4:3", "16:15"] }, { name: "Bit Rate", values: ["256kbps", "512kbps"] }] }, { categoryName: "Audio", categoryAttributes: [{ name: "Speaker", values: ["In-built", "External Connector"] }, { name: "Bit Rate", values: ["256kbps", "376kbps", "512kbps"] }] }] },
    filters2 = { categories: [{ categoryName: "Video", categoryAttributes: [{ name: "aspectRatio", values: ["4:3", "16:15", "16:9"] }, { name: "Bit Rate", values: ["256kbps", "512kbps", "1024kbps"] }] }, { categoryName: "Audio", categoryAttributes: [{ name: "Speaker", values: ["In-built", "External Connector"] }, { name: "Bit Rate", values: ["256kbps", "376kbps", "512kbps", "1024kbps"] }] }, { categoryName: "OS", categoryAttributes: [{ name: "Android", values: ["Lolipop", "Marshmello"] }, { name: "Apple", values: ["IOS 5", "IOS 6"] }] }] },
    parts = [
        ['categoryName', 'categoryAttributes'],
        ['name', 'values']
    ],
    fn = (a, b) => [...new Set([...a, ...b])],
    categories = merge(filters1.categories, filters2.categories, parts, fn),
    result = { categories };

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
function merge(a, b, entries, final, index = 0) {
    var [k, v] = entries[index];
    return b.reduce((r, o) => {
        var temp = r.find(q => o[k] === q[k]);
        if (!temp) {
            r.push(o);
        } else if (index + 1 === entries.length) {
            temp[v] = final(temp[v], o[v]);
        } else {
            merge(temp[v], o[v], entries, final, index + 1);
        }                
        return r;
    }, a);
}

var filters1 = { categories: [{ categoryName: "Video", categoryAttributes: [{ name: "aspectRatio", values: ["4:3", "16:15"] }, { name: "Bit Rate", values: ["256kbps", "512kbps"] }] }, { categoryName: "Audio", categoryAttributes: [{ name: "Speaker", values: ["In-built", "External Connector"] }, { name: "Bit Rate", values: ["256kbps", "376kbps", "512kbps"] }] }] },
    filters2 = { categories: [{ categoryName: "Video", categoryAttributes: [{ name: "aspectRatio", values: ["4:3", "16:15", "16:9"] }, { name: "Bit Rate", values: ["256kbps", "512kbps", "1024kbps"] }] }, { categoryName: "Audio", categoryAttributes: [{ name: "Speaker", values: ["In-built", "External Connector"] }, { name: "Bit Rate", values: ["256kbps", "376kbps", "512kbps", "1024kbps"] }] }, { categoryName: "OS", categoryAttributes: [{ name: "Android", values: ["Lolipop", "Marshmello"] }, { name: "Apple", values: ["IOS 5", "IOS 6"] }] }] },
    parts = [
        [undefined, 'categories'],
        ['categoryName', 'categoryAttributes'],
        ['name', 'values']
    ],
    fn = (a, b) => [...new Set([...a, ...b])],
    result = merge([filters1], [filters2], parts, fn);

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
Source Link
Nina Scholz
  • 387.9k
  • 26
  • 367
  • 417

You could take a dynamic function which takes two arrays, and array of entries with key and value names, a function processing the final level and an index.

function merge(a, b, entries, final, index = 0) {
    var [k, v] = entries[index];
    return b.reduce((r, o) => {
        var temp = r.find(q => o[k] === q[k]);
        if (!temp) {
            r.push(o);
        } else if (index + 1 === entries.length) {
            temp[v] = final(temp[v], o[v]);
        } else {
            merge(temp[v], o[v], entries, final, index + 1);
        }                
        return r;
    }, a);
}

var filters1 = { categories: [{ categoryName: "Video", categoryAttributes: [{ name: "aspectRatio", values: ["4:3", "16:15"] }, { name: "Bit Rate", values: ["256kbps", "512kbps"] }] }, { categoryName: "Audio", categoryAttributes: [{ name: "Speaker", values: ["In-built", "External Connector"] }, { name: "Bit Rate", values: ["256kbps", "376kbps", "512kbps"] }] }] },
    filters2 = { categories: [{ categoryName: "Video", categoryAttributes: [{ name: "aspectRatio", values: ["4:3", "16:15", "16:9"] }, { name: "Bit Rate", values: ["256kbps", "512kbps", "1024kbps"] }] }, { categoryName: "Audio", categoryAttributes: [{ name: "Speaker", values: ["In-built", "External Connector"] }, { name: "Bit Rate", values: ["256kbps", "376kbps", "512kbps", "1024kbps"] }] }, { categoryName: "OS", categoryAttributes: [{ name: "Android", values: ["Lolipop", "Marshmello"] }, { name: "Apple", values: ["IOS 5", "IOS 6"] }] }] },
    parts = [
        ['categoryName', 'categoryAttributes'],
        ['name', 'values']
    ],
    fn = (a, b) => [...new Set([...a, ...b])],
    categories = merge(filters1.categories, filters2.categories, parts, fn),
    result = { categories };

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }