【问题标题】:How to merge array of objects A and B and form array of object C contains new key value pair?如何合并对象 A 和 B 的数组并形成对象 C 的数组包含新的键值对?
【发布时间】:2018-11-21 15:06:31
【问题描述】:

我正在使用 Node.js 进行编程, 在下面的对象数组中 AB 的数组也有一些重复值,但我们必须仅基于 func_id 的数组。在数组 C 中,我们根据 func_id 推送 AB func_score 值> 和 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
}
]

注意:

【问题讨论】:

    标签: arrays node.js object arraylist arrayobject


    【解决方案1】:

    这是一种可能更简单的方法。

    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);

    【讨论】:

    • 您好 Jim B,您的方法工作得很好,就像我想要的一样。非常感谢。
    【解决方案2】:

    你的bug很简单,先把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;
            }
        });
    });
    

    【讨论】:

    • 嗨 ssemilla,即使我按照你的建议更改了代码,但我仍然没有得到预期的输出,但是,在另一个人 Jim 先生下面给出了另一种更简单的方法,它工作正常。无论如何谢谢你的东西。
    【解决方案3】:

    您可以在没有下面所有代码的情况下执行此操作,只需执行 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/

    【讨论】:

    • 嗨 Rick ,A.concat(B) 不是正确的解决方案,请查看预期输出
    猜你喜欢
    • 2019-07-23
    • 2017-01-16
    • 2020-10-03
    • 2018-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多