javascript - 用javascript合并数组中的对象
问题描述
我有三个对象(productData、stockData、locationData)。productData 有两个数据 productId 和 productName。stockData 有 productId、locationId 和 stock。我想将它全部合并到一个新数组中。例如,我有三个对象,例如下面的代码片段,然后将其合并:
const productData = [
{productId: 1000,productName: 'Product 1000'},
{productId: 1001,productName: 'Product 1001'}
];
const stockData = [
{productId: 1000,locationId: 1,stock: 21},
{productId: 1000,locationId: 2,stock: 8},
{productId: 1001,locationId: 1,stock: 4},
{productId: 1001,locationId: 2,stock: 10}
];
const locationData = [
{locationId: 1,locationName: 'Location 1'},
{locationId: 2,locationName: 'Location 2'}
];
我想将该对象合并为一个新数组,结果如下:
const result = [
{
productName: 'Product 1000',
stock: {
total: 29,
detail: [
{
locationName: 'Location 1',
stock: 21
},
{
locationName: 'Location 2',
stock: 8
}
]
}
},
{
productName: 'Product 1001',
stock: {
total: 14,
detail: [
{
locationName: 'Location 1',
stock: 4
},
{
locationName: 'Location 2',
stock: 10
}
]
}
}
];
我不知道,到目前为止我喜欢这样:
function mergeArrayObjects(arr1,arr2,arr3){
let mulai = 0;
let stok = 0;
let stok2 = 0;
let mulaiStok = 0;
let detail = [];
let merge = [];
while(mulai < arr1.length){
while(mulaiStok < arr2.length){
if(arr1[0].productId === arr2[mulaiStok].productId){
stok = stok + arr2[mulaiStok].stock
}
if(arr1[1].productId === arr2[mulaiStok].productId){
stok2 = stok2 + arr2[mulaiStok].stock
}
mulaiStok++
}
merge.push({
productName: arr1[mulai].productName,
stock: {
total:stok2,
detail:detail}
})
mulai++
}
return merge;
}
console.log(mergeArrayObjects(productData, stockData, locationData))
解决方案
我将首先迭代 productData 列表并为它们中的每一个创建一个空的产品对象,例如:
let product = {
productName: pd.productName,
stock: {
total: 0,
detail: []
}
};
然后我会迭代产品列表并搜索他们的库存以添加到库存列表详细信息,同时增加总库存。
如果您愿意,也可以从迭代 stockData 列表开始。
这应该做的工作:
const productData = [
{productId: 1000,productName: 'Product 1000'},
{productId: 1001,productName: 'Product 1001'}
];
const stockData = [
{productId: 1000,locationId: 1,stock: 21},
{productId: 1000,locationId: 2,stock: 8},
{productId: 1001,locationId: 1,stock: 4},
{productId: 1001,locationId: 2,stock: 10}
];
const locationData = [
{locationId: 1,locationName: 'Location 1'},
{locationId: 2,locationName: 'Location 2'}
];
function mergeObj(productDataList, stockDataList, locationDataList) {
let result = [];
productDataList.forEach(pd => {
let product = {
productName: pd.productName,
stock: {
total: 0,
detail: []
}
};
let stockList = stockDataList.filter(sd => sd.productId === pd.productId);
if (stockList.length > 0) {
stockList.forEach(sl => {
let location = locationDataList.find(ld => ld.locationId === sl.locationId);
if (location) {
let detail = {
locationName: location.locationName,
stock: sl.stock
}
product.stock.total += sl.stock;
product.stock.detail.push(detail);
} else {
console.error('Location not found for stock data');
}
})
}
result.push(product);
});
return result;
}
console.log('Object merged: ', mergeObj(productData, stockData, locationData));
推荐阅读
- wicket - 使用 apache isis 打开到 sql 的连接没有关闭
- r - 指定 glmer 优化器时疏通不起作用
- amazon-web-services - 从 Google Firebase Realtime DB 记录更改订阅事件迁移到 AWS Dynamo DB
- java - 当我以编程方式通过我的 android 应用程序发送消息时,我收到“+”前缀
- php - 如何将数据(选择选项)查询循环到数据库中,包括同一数据库下不同行中的每个查询
- php - 使用 PHP 转发带有表情符号的 Twilio SMS
- javascript - Photoshop 的 Extendscript 或 Javascript 中是否有任何等效的“document.getElementById”?
- android - Android TransactionTooLargeException 不知道是什么原因造成的
- sql-server - 可以在多多边形中获得单个多边形吗?
- html - 博客菜单未显示在移动屏幕上