【问题标题】:Using JavaScript, how to join two arrays of objects based on array of column names?使用 JavaScript,如何根据列名数组连接两个对象数组?
【发布时间】:2022-11-16 11:16:30
【问题描述】:

假设我有一个看起来像这样的对象数组,它代表数据库中的所有记录:

let data1 = [
    {"name": "ethan", "age": 18, "class": "A", "grade": 83},
    {"name": "sam", "age": 13, "class": "A", "grade": 43},
    {"name": "mark", "age": 14, "class": "D", "grade": 33},
    {"name": "dick", "age": 14, "class": "B", "grade": 85},
    {"name": "luke", "age": 15, "class": "A", "grade": 93},
    {"name": "adam", "age": 5, "class": "C", "grade": 55},
]

我想根据一些列名“名称”和“类”执行连接,因为它们是主键。

let cols = ["name", "class"];

现在我有另一个对象数组

let data2 = [
    {"name": "ethan", "age": 48, "class": "A", "grade": 49},
    {"name": "dick", "age": 24, "class": "B", "grade": 43},
]

我想要一个循环遍历 data1 中每条记录的函数,然后检查“名称”值和“类”值是否与 data2 中在相同列中具有相同值的任何记录相匹配。如果是,则 data1 记录将被推送到一个新数组。新数组将在函数结束时返回。

例如,该函数将从 data1 中的第一项开始,{"name": "ethan", "age": 18, "class": "A", "grade": 83}, 并在 data2 中查找也具有名称的匹配记录“伊桑”和类“一个”,忽略其他列的值,如果找到匹配项,则{"name": "ethan", "age": 18, "class": "A", "grade": 83}被推送到输出数组。

这是我想象的函数的样子,我希望选中的键作为数组传递,以便解决方案是动态的。

function getSubset(cols, data1, data2) {
    let output = [];
    for (let i = 0; i < data1; i++) { //loop through each item in data1
        let item = data1[I];
        //checks here
        //if match found in data2, push to output array
    }

    return output;
}



//expected output = 
//[ {"name": "ethan", "age": 18, "class": "A", "grade": 83},
//  {"name": "dick", "age": 14, "class": "B", "grade": 85},
//]

【问题讨论】:

  • 那么,您的具体问题是什么?在我看来你的想法是对的。
  • 因此,循环遍历 data2 以比较每一行,并循环遍历 cols 以检查两个项目中所有相应的属性值是否相同。你到底有什么问题?

标签: javascript node.js json algorithm javascript-objects


【解决方案1】:

您可以利用各种数组函数来实现它:

let data1 = [
    {"name": "ethan", "age": 18, "class": "A", "grade": 83},
    {"name": "sam", "age": 13, "class": "A", "grade": 43},
    {"name": "mark", "age": 14, "class": "D", "grade": 33},
    {"name": "dick", "age": 14, "class": "B", "grade": 85},
    {"name": "luke", "age": 15, "class": "A", "grade": 93},
    {"name": "adam", "age": 5, "class": "C", "grade": 55},
];

let data2 = [
    {"name": "ethan", "age": 48, "class": "A", "grade": 49},
    {"name": "dick", "age": 24, "class": "B", "grade": 43},
]

let cols = ["name", "class"];

function getSubset(cols, data1, data2) {
    return data1.filter(d1 => data2.some(d2 => cols.every(key => d1[key] === d2[key])));
}

const result = getSubset(cols, data1, data2);

console.log(result);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-24
    • 1970-01-01
    • 2017-07-14
    • 2014-03-10
    • 2016-10-21
    • 2021-09-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多