Как объединить массив объектов A и B и сформировать массив объекта C, содержащий новую пару ключ-значение? - PullRequest
0 голосов
/ 21 ноября 2018

Я использую Node.js для программирования. В приведенном ниже массиве объектов A и B есть массивы с некоторыми значениями дубликатов, но мы должны пропустить дублированныетолько на основе func_id массивов.В массиве C мы имеем push A и B func_score значения, основанные на func_id и func_score_A из A (func_score) массив и func_score_B из B (func_score) массив.

Пример кода:

var A = [{
    "func_id": 1,
    "func_score": 0.4
}, {
    "func_id": 2,
    "func_score": 0.5
}, {
    "func_id": 3,
    "func_score": 0.7
}];
var B = [{
    "func_id": 3,
    "func_score": 0.9
}, {
    "func_id": 4,
    "func_score": 0.7
}, {
    "func_id": 5,
    "func_score": 0.8
}];
var C = [];
var tmpArray = [];
A.forEach(function(element) {
    B.forEach(function(loop) {
        if (element.func_id === loop.func_id) {
            var tmpObje = {
                func_id: element.func_id,
                func_sore_A: element.func_score,
                func_sore_B: loop.func_score
            }
            tmpArray.push(tmpObje);
            C.push(tmpObje);
            return;
        }
    });
});

A.forEach(function(element) {
    tmpArray.forEach(function(loop) {
        if (element.func_id !== loop.func_id) {
            var smsObj = {
                func_id: element.func_id,
                func_sore_A: element.func_score,
                func_sore_B: 0
            }
            C.push(smsObj);
            return;
        }
    });
});

B.forEach(function(element) {
    tmpArray.forEach(function(loop) {
        if (element.func_id !== loop.func_id) {
            var domineObj = {
                func_id: element.func_id,
                func_sore_A: 0,
                func_sore_B: loop.func_score
            }
            C.push(domineObj);
            return;
        }
    });
});
console.log(C);

Ожидаемый результат

[
{"func_id": 1, 
"func_score_A": 0.4,
"func_score_B":0
}, 
{"func_id": 2, 
"func_score_A": 0.5,
"func_score_B":0
},
{"func_id": 3, 
"func_score_A": 0.7,
"func_score_B":0.9
},
{"func_id": 4, 
"func_score_A": 0,
"func_score_B":0.7
},
{"func_id": 5, 
"func_score_A": 0,
"func_score_B":0.8
}
]

Примечание:

Ответы [ 3 ]

0 голосов
/ 21 ноября 2018

Вот подход, который может быть немного проще.

var A = [{
    "func_id": 1,
    "func_score": 0.4
}, {
    "func_id": 2,
    "func_score": 0.5
}, {
    "func_id": 3,
    "func_score": 0.7
}];

var B = [{
    "func_id": 3,
    "func_score": 0.9
}, {
    "func_id": 4,
    "func_score": 0.7
}, {
    "func_id": 5,
    "func_score": 0.8
}];

let C = A.map(e => {
    return {
        func_id: e.func_id,
        func_score_A: e.func_score,
        func_score_B: 0
    };
});
B.forEach(e => {
    let i = C.findIndex(x => x.func_id == e.func_id);
    if (i >= 0) {
        C[i].func_score_B = e.func_score;
    } else {
        C.push({
            func_id: e.func_id,
            func_score_A: 0,
            func_score_B: e.func_score
        })
    }
});
console.log(C);
0 голосов
/ 22 ноября 2018

Ваша ошибка довольно проста, сначала замените все sore на score.Тогда в вашем цикле B.forEach() вы, возможно, допустили ошибку, взяв loop.func_score вместо element.func_score.

B.forEach(function(element) {
    tmpArray.forEach(function(loop) {
        if (element.func_id !== loop.func_id) {
            var domineObj = {
                func_id: element.func_id,
                func_sore_A: 0,
                // loop should be element
                // func_sore_B: loop.func_score
                func_sore_B: element.func_score
            }
            C.push(domineObj);
            return;
        }
    });
});
0 голосов
/ 21 ноября 2018

Вы можете сделать это без всего приведенного ниже кода, просто выполните var C = A.concat(B)

var A = [{
    "func_id": 1,
    "func_score": 0.4
}, {
    "func_id": 2,
    "func_score": 0.5
}, {
    "func_id": 3,
    "func_score": 0.7
}];
var B = [{
    "func_id": 3,
    "func_score": 0.9
}, {
    "func_id": 4,
    "func_score": 0.7
}, {
    "func_id": 5,
    "func_score": 0.8
}];

//check the console for output
console.log(A.concat(B));

рабочий пример: https://jsfiddle.net/1e304w7t/

...