underscore/lodash 合并数组

underscore/lodash merge arrays

您好,有人可以帮忙吗?

有一些具有 类 属性的成绩数组,例如下面这两个:

var arr1 = [{
    "id": 53,
    "name": "Grade 1 AppMonkeyzTest",
    "classes": [{
        "id": 54,
        "name": "Class 1A AppMonkeyzTest"
    }, {
        "id": 55,
        "name": "Class 1B AppMonkeyzTest"
    }, {
        "id": 59,
        "name": "Class BG1 AppMonkeyzTest"
    }]
}, {
    "id": 54,
    "name": "Grade 2 AppMonkeyzTest",
    "classes": [{
        "id": 56,
        "name": "Class AA1 ppMonkeyzTest"
    }, {
        "id": 57,
        "name": "Class BA1 AppMonkeyzTest"
    }]
}];  

var arr2 = [{
    "id": 53,
    "name": "Grade 1 AppMonkeyzTest",
    "classes": [{
        "id": 58,
        "name": "Class BB1 AppMonkeyzTest"
    }]
}];

我想要的只是将它们合并为单个成绩数组,每个 grade.id 具有唯一的 类,如下所示:

var merge = [
        {
            "id": 53,
            "name": "Grade 1 AppMonkeyzTest",
            "classes": [{
                "id": 54,
                "name": "Class 1A AppMonkeyzTest"
            }, {
                "id": 55,
                "name": "Class 1B AppMonkeyzTest"
            }, {
                "id": 59,
                "name": "Class BG1 AppMonkeyzTest"
            }, {
                "id": 58,
                "name": "Class BB1 AppMonkeyzTest"
            }]
        },
        {
            "id": 54,
            "name": "Grade 2 AppMonkeyzTest",
            "classes": [{
                "id": 56,
                "name": "Class AA1 ppMonkeyzTest"
            }, {
                "id": 57,
                "name": "Class BA1 AppMonkeyzTest"
            }]
        }];

使用 _.merge 回调,就像这样

var arr1 = [{
    "id": 53,
    "name": "Grade 1 AppMonkeyzTest",
    "classes": [{
        "id": 54,
        "name": "Class 1A AppMonkeyzTest"
    }, {
        "id": 55,
        "name": "Class 1B AppMonkeyzTest"
    }, {
        "id": 59,
        "name": "Class BG1 AppMonkeyzTest"
    }]
}, {
    "id": 54,
    "name": "Grade 2 AppMonkeyzTest",
    "classes": [{
        "id": 56,
        "name": "Class AA1 ppMonkeyzTest"
    }, {
        "id": 57,
        "name": "Class BA1 AppMonkeyzTest"
    }]
}];

var arr2 = [{
    "id": 53,
    "name": "Grade 1 AppMonkeyzTest",
    "classes": [{
        "id": 58,
        "name": "Class BB1 AppMonkeyzTest"
    }]
}];

var res = _.merge(arr1, arr2, function (a, b) {
    if (_.isArray(a)) {
        return a.concat(b);
    }
});

console.log(res);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/3.9.3/lodash.js"></script>

您可以使用 _.findIndex():

var merge = [];

arr1.forEach(function(object){
    var i = _.findIndex(merge, { id: object.id });
    if(i){
        merge[i].classes = merge[i].classes.concat(object.classes)
    }else{
        merge.push(object);
    }
});

arr2.forEach(function(object){
    var i = _.findIndex(merge, { id: object.id });
    if(i){
        merge[i].classes = merge[i].classes.concat(object.classes)
    }else{
        merge.push(object);
    }
});

在 JS 中

var arr1 = [{
    "id": 53,
    "name": "Grade 1 AppMonkeyzTest",
    "classes": [{
        "id": 54,
        "name": "Class 1A AppMonkeyzTest"
    }, {
        "id": 55,
        "name": "Class 1B AppMonkeyzTest"
    }, {
        "id": 59,
        "name": "Class BG1 AppMonkeyzTest"
    }]
}, {
    "id": 54,
    "name": "Grade 2 AppMonkeyzTest",
    "classes": [{
        "id": 56,
        "name": "Class AA1 ppMonkeyzTest"
    }, {
        "id": 57,
        "name": "Class BA1 AppMonkeyzTest"
    }]
}];
var arr2 = [{
    "id": 53,
    "name": "Grade 1 AppMonkeyzTest",
    "classes": [{
        "id": 58,
        "name": "Class BB1 AppMonkeyzTest"
    }]
}];
var arr3 = [];
for (var i in arr1) {
    arr3.push(arr1[i]);
    for (var j in arr2) {
        if (arr2[j].id == arr1[i].id) {
            for (var k in arr2[j].classes) {
                arr3[i].classes.push(arr2[j].classes[k]);
            }

        }
    }

}
console.log(arr3);  

DEMO