将值数组与另一个对象匹配

时间:2018-09-27 06:32:13

标签: javascript node.js

我对此很陌生,我有一个如下所示的对象数组,

arr1 = {
    "ID": "sss",
    "Name": "Ven"
    "Main": [
        {"ID": "asds-vg45"},
        {"ID": "rrra-2e82"}
    ]
}

和另一个值对象,如下所示,

obj1 = {
    "AID": "ssasas222",
    "Main": {
    "asds-vg45" : {
        "NAME" : "Item1",
        "STML" : {
            "MIKE" : {
                "bearer" : {
                    "token" : "ya29.Gl0kBoYJD"
                },
                "STA" : true
            }
        },
        "STATUS" : true
    },
    "rrra-2e82" : {
        "NAME" : "Item2",
        "STML" : {
            "MIKE" : {
                "bearer" : {
                    "token" : "yas9.Gl0kBoYJD"
                },
                "STA" : true
            }
        },
        "STATUS" : true
    },
    "t655e-2e82" : {
        "NAME" : "Item2",
        "STML" : {
            "MIKE" : {
                "bearer" : {
                    "token" : "yas9.Gl0kBoYJD"
                },
                "STA" : true
            }
        },
        "STATUS" : true
    }
}

现在,我正在尝试为它提供一个新对象,该对象包括所有与“ arr1”和“ obj1”中的“ ID”匹配的“ Main”对象的obj1中匹配的所有值,此处的匹配ID为两者都通用的“ Main”数组中,我尝试获取的输出如下所示,

main_obj = {
    "ID": "sss",
    "Name": "Ven",
    "AID": "ssasas222"
    "Main": {
        "asds-vg45" : {
            "NAME" : "Item1",
            "STML" : {
                "MIKE" : {
                    "bearer" : {
                        "token" : "ya29.Gl0kBoYJD"
                    },
                    "STA" : true
                }
            },
            "STATUS" : true
        },
        "rrra-2e82" : {
            "NAME" : "Item2",
            "STML" : {
                "MIKE" : {
                    "bearer" : {
                        "token" : "yas9.Gl0kBoYJD"
                    },
                    "STA" : true
                }
            },
            "STATUS" : true
        }
    }
}

2 个答案:

答案 0 :(得分:0)

您应该可以使用reduce来做到这一点:

const matches = arr1.Main
  .reduce((acc, cur) => {
    if (obj1.Main[cur.ID]) {
      acc[cur.ID]: obj1.Main[cur.ID]
    }
    return acc
  }, {})

const mainObj = {
  ID: arr1.ID,
  Name: arr1.Name,
  AID: obj1.AID,
  Main: matches
}

您只需遍历ID数组并使用匹配的键构建新对象acc

答案 1 :(得分:0)

您可以将给定数据的键和对象映射为新对象。

var data = { AID: "ssasas222", Main: { "asds-vg45": { NAME: "Item1", STML: { MIKE: { bearer: { token: "ya29.Gl0kBoYJD" }, STA: true } }, STATUS: true }, "rrra-2e82": { NAME: "Item2", STML: { MIKE: { bearer: { token: "yas9.Gl0kBoYJD" }, STA: true } }, STATUS: true }, "t655e-2e82": { NAME: "Item2", STML: { MIKE: { bearer: { token: "yas9.Gl0kBoYJD" }, STA: true } }, STATUS: true } } },
    filter = { ID: "sss", Name: "Ven", Main: [{ ID: "asds-vg45" }, { ID: "rrra-2e82" }] },
    result = Object.assign(
        {},
        data,
        { Main: Object.assign(...filter.Main.map(({ ID }) => ({ [ID]: data.Main[ID] }))) }
    );

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