【问题标题】:Restructuring JS array of objects重构JS对象数组
【发布时间】:2019-12-17 07:43:02
【问题描述】:

我在一个 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”键,然后检查每个属性以查看它是否不同。如果是,我需要将所述属性转换为存储所有值的数组,为两个或更多。

【问题讨论】:

标签: javascript arrays json reactjs object


【解决方案1】:

遍历数组并为每个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)

【讨论】:

  • 很好地使用flat
  • 如果您从不使用i,为什么还要使用第一个循环?
  • 这叫做分心。经常发生
  • 酷!这不是操作要求的结果 ?
  • 是的,在合并之前我没有检查值是否相等。 if(obj[key] && obj[key] !== item[key]) 解决,已编辑。谢谢
【解决方案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);

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

【讨论】:

  • 很好地使用reduce
【解决方案3】:

如果属性存在或值是否存在或值是否在数组内部,您可以获得条目并检查。

否则赋值或创建一个包含先前值和实际值的数组。

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; }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-12
    • 2021-06-18
    • 1970-01-01
    • 1970-01-01
    • 2018-05-11
    • 2016-05-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多