重组对象的JS数组

时间:2019-08-09 14:29:47

标签: javascript arrays json reactjs object

我正在一个ReactJS应用程序中工作,在其中我检索了一些产品的JSON,并且我需要重新构造此信息以进行分类和显示该信息。

我已经尝试过使用过滤器和地图,但结果没有达到预期。

[
    {
        "barcode": "8434786768366",
        "collection": "AW",
        "colorCode": "413",
        "colorName": "LIGHT WINE",
        "familyCode": "1",
        "familyName": "T-Shirts",
        "genericProduct": "PM506471",
        "id": 263917,
        "productCode": "PM506471413S",
        "productName": "T-SHIRT",
        "productNameLang": "en",
        "season": "2019",
        "size": "S",
        "subfamilyName": "SS T-Shirts"
    },
    {
        "barcode": "8434786768342",
        "collection": "AW",
        "colorCode": "413",
        "colorName": "LIGHT WINE",
        "familyCode": "1",
        "familyName": "T-Shirts",
        "genericProduct": "PM506471",
        "id": 263921,
        "productCode": "PM506471413L",
        "productName": "T-SHIRT",
        "productNameLang": "en",
        "season": "2019",
        "size": "L",
        "subfamilyName": "SS T-Shirts"
    }
]

这是我正在使用的示例,尽管原始数组要大得多。我需要能够找到具有相同“ genericProduct”的所有对象,并将它们合并到一个对象中,以便删除重复项。但是,我需要保留信息而不是覆盖信息。

按照上面的示例,这两个对象应合并为以下内容:

[
    {
        "barcode": ["8434786768366", "8434786768342"],
        "collection": "AW",
        "colorCode": "413",
        "colorName": "LIGHT WINE",
        "familyCode": "1",
        "familyName": "T-Shirts",
        "genericProduct": "PM506471",
        "id": [263917, 263917],
        "productCode": ["PM506471413S","PM506471413L"],
        "productName": "T-SHIRT",
        "productNameLang": "en",
        "season": "2019",
        "size": ["S","L"],
        "subfamilyName": "SS T-Shirts"
    }
]

作为 tl; dr ,我需要在对象数组中进行迭代以查看哪个具有相同的“ genericProduct”键,然后检查每个属性以查看其是否不同。如果是这样,我需要将所述属性转换为一个存储所有值(两个或多个)的数组。

3 个答案:

答案 0 :(得分:3)

遍历数组,并为每个item声明一个空对象。现在,检查整个数组是否存在该对象中的重复项,并将重复的property合并到数组中。

const items = [
    {
        "barcode": "8434786768366",
        "collection": "AW",
        "colorCode": "413",
        "colorName": "LIGHT WINE",
        "familyCode": "1",
        "familyName": "T-Shirts",
        "genericProduct": "PM506471",
        "id": 263917,
        "productCode": "PM506471413S",
        "productName": "T-SHIRT",
        "productNameLang": "en",
        "season": "2019",
        "size": "S",
        "subfamilyName": "SS T-Shirts"
    },
    {
        "barcode": "8434786768342",
        "collection": "AW",
        "colorCode": "413",
        "colorName": "LIGHT WINE",
        "familyCode": "1",
        "familyName": "T-Shirts",
        "genericProduct": "PM506471",
        "id": 263921,
        "productCode": "PM506471413L",
        "productName": "T-SHIRT",
        "productNameLang": "en",
        "season": "2019",
        "size": "L",
        "subfamilyName": "SS T-Shirts"
    }
]

const result = []

   const obj = {}
   items.map(item =>{
       Object.keys(item).map(key =>{
           if(obj[key] && obj[key] !== item[key])
               return obj[key] = [obj[key], item[key]].flat()
            return obj[key] = item[key]
       })
   })
 
   result.push(obj)
   

console.log(result)

答案 1 :(得分:2)

您在这里!我做了两个假设:

  • 保留值的重复项
  • 所有对象都具有相同的属性,并且它们的值绝不是对象(例如示例数据中的对象)

您可能在正确的方向上查看Array方法。也许您错过了看reduce的机会?

const data = [
  {
    barcode: "8434786768366",
    collection: "AW",
    colorCode: "413",
    colorName: "LIGHT WINE",
    familyCode: "1",
    familyName: "T-Shirts",
    genericProduct: "PM506471",
    id: 263917,
    productCode: "PM506471413S",
    productName: "T-SHIRT",
    productNameLang: "en",
    season: "2019",
    size: "S",
    subfamilyName: "SS T-Shirts"
  },
  {
    barcode: "8434786768342",
    collection: "AW",
    colorCode: "413",
    colorName: "LIGHT WINE",
    familyCode: "1",
    familyName: "T-Shirts",
    genericProduct: "PM506471",
    id: 263921,
    productCode: "PM506471413L",
    productName: "T-SHIRT",
    productNameLang: "en",
    season: "2019",
    size: "L",
    subfamilyName: "SS T-Shirts"
  },
  {
    barcode: "8434786768342",
    collection: "AW",
    colorCode: "413",
    colorName: "LIGHT WINE",
    familyCode: "1",
    familyName: "T-Shirts",
    genericProduct: "PM506471",
    id: 263921,
    productCode: "PM506471413L",
    productName: "T-SHIRT",
    productNameLang: "en",
    season: "2019",
    size: "L",
    subfamilyName: "SS T-Shirts"
  }
];

const result = data.reduce((acc, product) => {
  const merged = Object.keys(product)
    .filter(key => acc[key] !== product[key])
    .reduce(
      (mergedObject, key) => ({
        ...mergedObject,
        [key]:
          acc[key] instanceof Array
            ? acc[key].concat([product[key]])
            : [acc[key], product[key]]
      }),
      {}
    );

  return {
    ...acc,
    ...merged
  };
});

console.log(result);

更新简化并使用更好的变量名

答案 2 :(得分:0)

如果属性存在或值存在,或者值在数组内部,则可以获取条目和chck。

否则,分配值或使用以前的值和实际值创建一个数组。

var data = [{ barcode: "8434786768366", collection: "AW", colorCode: "413", colorName: "LIGHT WINE", familyCode: "1", familyName: "T-Shirts", genericProduct: "PM506471", id: 263917, productCode: "PM506471413S", productName: "T-SHIRT", productNameLang: "en", season: "2019", size: "S", subfamilyName: "SS T-Shirts" }, { barcode: "8434786768342", collection: "AW", colorCode: "413", colorName: "LIGHT WINE", familyCode: "1", familyName: "T-Shirts", genericProduct: "PM506471", id: 263921, productCode: "PM506471413L", productName: "T-SHIRT", productNameLang: "en", season: "2019", size: "L", subfamilyName: "SS T-Shirts" }],
    result = data.reduce((r, o) => {
        Object.entries(o).forEach(([k, v]) => {
            if (!(k in r)) return r[k] = v;
            if (r[k] === v || Array.isArray(r[k]) && r[k].includes(v)) return;
            r[k] = [].concat(r[k], v);
        });        
        return r;
    }, {});

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

相关问题