好吧,我在 node.js 中有三个数组,每个数组大约有 65k 个对象。它们都共享一个 ID - PARCELID、SBL 和 SBL20 是相同的。我想将不同数组中的对象组合成一个对象,然后将其插入最终数组中。无论出于何种原因,我得到的输出包含 130k+ 对象。这也是相当低效的,所以如果有更好的方法来做到这一点,我会洗耳恭听 - 我已经尝试使用map(),尽管我只能比较两个数组,而不是三个。我也想添加第四个。
var final = new Array();
count=0
TaxParcels.forEach((TaxParcel) => {
TaxBills.forEach((TaxBill) => {
if (TaxParcel.PARCELID == TaxBill.SBL20) {
CodeEnforcements.forEach((CodeEnforcement) => {
if (TaxParcel.PARCELID == CodeEnforcement.SBL) {
parcel = {
ID: TaxParcel.PARCELID,
DETAILS: {
TaxParcel: TaxParcel,
TaxBill: TaxBill,
CodeEnforcement: CodeEnforcement,
},
};
final.push(parcel);
count++
}
});
}
});
});
console.log(final);
console.log(count)
最佳答案
您可以通过首先创建一个由键作为键控的 Map 并使用与每个 Map 相关的空对象来获得性能提升。然后将对象注入(inject)到这些对象中,并过滤结果以仅包含具有所有 3 个键的对象:
// sample data
let TaxParcels = [{ PARCELID: 3 }, { PARCELID: 9 }, { PARCELID: 7 }];
let TaxBills = [{ SBL20: 9 }, { SBL20: 1 }, { SBL20: 3 }];
let CodeEnforcements = [{ SBL: 3 }, { SBL: 9 }, { SBL: 1 }];
// Solution
let map = new Map([...TaxParcels, ...TaxBills, ...CodeEnforcements].map(o =>
[o.PARCELID??o.SBL20??o.SBL, {}])
);
for (let o of TaxParcels) map.get(o.PARCELID).TaxParcel = o;
for (let o of TaxBills) map.get(o.SBL20).TaxBill = o;
for (let o of CodeEnforcements) map.get(o.SBL).CodeEnforcement = o;
let result = [...map.values()].filter(o => Object.keys(o).length === 3);
console.log(result);
console.log(result.length);
关于javascript - 比较三个非常大的数组并创建一个新对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68608977/