首页 > 解决方案 > 用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))

标签: javascriptobjectmerge

解决方案


我将首先迭代 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));


推荐阅读