每个循环中如何对Json对象进行分组

4
你好,我来自PHP背景,现在想通过JavaScript/JQuery对一些JSON数据进行分组。我想通过截取SKU并将记录组合在一起来对数据进行分组,这一步我已经成功了。但是我无法将数据放入“children”部分,它似乎只循环第一条记录。理想情况下,“children”部分应该包含JSON文件中的所有数据,但是按照父SKU进行分组。
我尝试过以下方法:

var items = [
  {
    product_type: "configurable",
    options: [
      {
        label: "Size",
        value: "7.5",
        option_id: 190,
        option_value: 106
      }
    ],
    qty: 3,
    item_id: "300",
    product_id: "88105",
    product_name: "MENS SHOE TUDOR BLACK",
    product_sku: "M1S-TUD02-AVEL-79-7.5",
  },
  {
    product_type: "configurable",
    options: [
      {
        label: "Size",
        value: "11",
        option_id: 190,
        option_value: 99
      }
    ],
    qty: 3,
    item_id: "298",
    product_id: "88105",
    product_name: "MENS SHOE TUDOR BLACK",
    product_sku: "M1S-TUD02-AVEL-79-11",
  },
  {
    product_type: "configurable",
    options: [
      {
        label: "Size",
        value: "M",
        option_id: 190,
        option_value: 66
      }
    ],
    qty: 1,
    item_id: "111",
    product_id: "99945",
    product_name: "WOMENS SWEATER",
    product_sku: "W1R-613K-A10400-96-M",
  },
  {
    product_type: "configurable",
    options: [
      {
        label: "Size",
        value: "L",
        option_id: 190,
        option_value: 12
      }
    ],
    qty: 20,
    item_id: "278",
    product_id: "99945",
    product_name: "WOMENS SWEATER",
    product_sku: "W1R-613K-A10400-96-L",
  },
];

var groupedItems = {};
$.each(items, function(key, item) {
  if (item.product_type === "configurable") {
    var sku = item.product_sku,
      parentSku = sku.replace(sku.substring(sku.lastIndexOf("-")), "");

    if (sku.indexOf(parentSku) >= 0) {
      groupedItems[parentSku] = {
        product_sku: parentSku,
        product_name: item.product_name,
        product_type: item.product_type,
        children: [item]
      };
    }
  }
});
console.log(groupedItems);
<!DOCTYPE html>
<html>
  <head>
    <title>Parcel Sandbox</title>
    <meta charset="UTF-8" />
  </head>

  <body>
    <script src="https://ajax.aspnetcdn.com/ajax/jQuery/jquery-3.2.1.min.js"></script>
  </body>
</html>

任何帮助都将不胜感激。我想要一个数组,可以将数据分组到它们各自的组中,并从第一条记录中获取一些信息,例如名称、父SKU等,然后在子部分中包含所有物品的信息,但显然是在它们各自的组中。希望这有意义!再次感谢!


你能提供一个预期输出的例子吗?在问题中请提供。 - molamk
2个回答

0

你可以使用 reduce 按照 product-sku 进行分组。

var items = [{
    product_type: "configurable",
    options: [{
      label: "Size",
      value: "7.5",
      option_id: 190,
      option_value: 106
    }],
    qty: 3,
    item_id: "300",
    product_id: "88105",
    product_name: "MENS SHOE TUDOR BLACK",
    product_sku: "M1S-TUD02-AVEL-79-7.5",
  },
  {
    product_type: "configurable",
    options: [{
      label: "Size",
      value: "11",
      option_id: 190,
      option_value: 99
    }],
    qty: 3,
    item_id: "298",
    product_id: "88105",
    product_name: "MENS SHOE TUDOR BLACK",
    product_sku: "M1S-TUD02-AVEL-79-11",
  },
  {
    product_type: "configurable",
    options: [{
      label: "Size",
      value: "M",
      option_id: 190,
      option_value: 66
    }],
    qty: 1,
    item_id: "111",
    product_id: "99945",
    product_name: "WOMENS SWEATER",
    product_sku: "W1R-613K-A10400-96-M",
  },
  {
    product_type: "configurable",
    options: [{
      label: "Size",
      value: "L",
      option_id: 190,
      option_value: 12
    }],
    qty: 20,
    item_id: "278",
    product_id: "99945",
    product_name: "WOMENS SWEATER",
    product_sku: "W1R-613K-A10400-96-L",
  },
];

var groupedItems = items.reduce((acc, item) => {
  if (item.product_type === "configurable") {
    var sku = item.product_sku;
    var parentSku = sku.replace(sku.substring(sku.lastIndexOf("-")), "");
  
    if (sku.indexOf(parentSku) >= 0) {
      if (!!acc[parentSku]) {
        let children = acc[parentSku].children;
        acc[parentSku].children = [...children, { ...item
        }];
      } else {
        acc[parentSku] = {
          product_sku: parentSku,
          product_name: item.product_name,
          product_type: item.product_type,
          children: [item]
        };
      }
    }
  }

  return acc;
}, []);

console.log(groupedItems);


请打开开发者工具并检查控制台。 - Sushanth --

0

尝试

items.forEach(x => {
  let k=x.product_sku.replace(/-[^-]*?$/,'');
  let g=groupedItems[k]||[];
  g.push(x);
  groupedItems[k]=g;
})

var items = [
  {
    product_type: "configurable",
    options: [
      {
        label: "Size",
        value: "7.5",
        option_id: 190,
        option_value: 106
      }
    ],
    qty: 3,
    item_id: "300",
    product_id: "88105",
    product_name: "MENS SHOE TUDOR BLACK",
    product_sku: "M1S-TUD02-AVEL-79-7.5",
  },
  {
    product_type: "configurable",
    options: [
      {
        label: "Size",
        value: "11",
        option_id: 190,
        option_value: 99
      }
    ],
    qty: 3,
    item_id: "298",
    product_id: "88105",
    product_name: "MENS SHOE TUDOR BLACK",
    product_sku: "M1S-TUD02-AVEL-79-11",
  },
  {
    product_type: "configurable",
    options: [
      {
        label: "Size",
        value: "M",
        option_id: 190,
        option_value: 66
      }
    ],
    qty: 1,
    item_id: "111",
    product_id: "99945",
    product_name: "WOMENS SWEATER",
    product_sku: "W1R-613K-A10400-96-M",
  },
  {
    product_type: "configurable",
    options: [
      {
        label: "Size",
        value: "L",
        option_id: 190,
        option_value: 12
      }
    ],
    qty: 20,
    item_id: "278",
    product_id: "99945",
    product_name: "WOMENS SWEATER",
    product_sku: "W1R-613K-A10400-96-L",
  },
];

var groupedItems = {};

items.forEach(x => {
  let k=x.product_sku.replace(/-[^-]*?$/,'');
  let g=groupedItems[k]||[];
  g.push(x);
  groupedItems[k]=g;
})
  
console.log(groupedItems);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接