首页 > 解决方案 > 如何根据 id 将数组的不同对象连接到一个对象中?

问题描述

我有这个结构 od 对象:

 let data = {
      item: { id: null },
      changedAttributionFields: [],
      changedAttributionSectionFields: [],
      itemAttributionSection: {},
      itemAttribution: {}
    };

在单元格值上,我触发一个事件并插入一个数组,我想要的是基于 item.id 连接对象。例如,如果我有这个:

[
{
  item{
    id:1
  },
changedAttributionSectionFields = ['test']
},
{
  item{
    id:2
  },
changedAttributionSectionFields = ['test 1']
},
{
  item{
    id:1
  },
changedAttributionSectionFields = ['test 12']
},
]

因为我有两次 id 1 我想拥有:

[
{
  item{
    id:1
  },
changedAttributionSectionFields = ['test', 'test 12']
},
{
  item{
    id:2
  },
changedAttributionSectionFields = ['test 1']
}
]

所以我想要两个具有相同 id 但相同对象的 concat 值的对象。有什么建议吗?

标签: javascript

解决方案


这是关于 TypeScript 的解决方案。请在下面找到有关 JavaScript 的示例。

   const arr = [
      {
        item: {
          id: 1,
        },
        changedAttributionSectionFields: ["test"],
        changedAttributionFields: [],
        itemAttributionSection: {},
        itemAttribution: {},
      },
      {
        item: {
          id: 2,
        },
        changedAttributionSectionFields: ["test 1"],
        changedAttributionFields: ["example 1"],
        itemAttributionSection: {},
        itemAttribution: {},
      },
      {
        item: {
          id: 1,
        },
        changedAttributionSectionFields: ["test 12"],
        changedAttributionFields: [],
        itemAttributionSection: {},
        itemAttribution: {},
      },
      {
        item: {
          id: 2,
        },
        changedAttributionSectionFields: ["test 13"],
        changedAttributionFields: ["example 2"],
        itemAttributionSection: {},
        itemAttribution: {},
      },
    ];
    
    interface IItem {
      id: number;
    }
    
    interface IObject {
      item: IItem;
      changedAttributionSectionFields: any[];
      changedAttributionFields: any[];
      itemAttributionSection: any;
      itemAttribution: any;
    }
    
    const concatItems = (arr: IObject[], concatAttributes: string[]) => {
      const result: IObject[] = [];
    
      for (const i of arr) {
        const foundItemIndex = result.findIndex((k) => k.item.id === i.item.id);
    
        if (foundItemIndex !== -1) {
          const foundItem = result[foundItemIndex];
    
          result[foundItemIndex] = { ...i };
    
          for (const attribute of concatAttributes) {
            result[foundItemIndex][attribute] = [
              ...(foundItem[attribute] || []),
              ...(i[attribute] || []),
            ];
          }
        } else {
          result.push(i);
        }
      }
    
      return result;
    };
    
    const result = concatItems(arr, ["changedAttributionSectionFields", 'changedAttributionFields']);
    
    console.log("result: ", result);

您可以指定 concatAttributes 进行连接。

const arr = [
  {
    item: {
      id: 1,
    },
    changedAttributionSectionFields: ["test"],
    changedAttributionFields: [],
    itemAttributionSection: {},
    itemAttribution: {},
  },
  {
    item: {
      id: 2,
    },
    changedAttributionSectionFields: ["test 1"],
    changedAttributionFields: ["example 1"],
    itemAttributionSection: {},
    itemAttribution: {},
  },
  {
    item: {
      id: 1,
    },
    changedAttributionSectionFields: ["test 12"],
    changedAttributionFields: [],
    itemAttributionSection: {},
    itemAttribution: {},
  },
  {
    item: {
      id: 2,
    },
    changedAttributionSectionFields: ["test 13"],
    changedAttributionFields: ["example 2"],
    itemAttributionSection: {},
    itemAttribution: {},
  },
];

const concatItems = (arr, concatAttributes) => {
  const result = [];

  for (const i of arr) {
    const foundItemIndex = result.findIndex((k) => k.item.id === i.item.id);

    if (foundItemIndex !== -1) {
      const foundItem = result[foundItemIndex];

      result[foundItemIndex] = { ...i };

      for (const attribute of concatAttributes) {
        result[foundItemIndex][attribute] = [
              ...(foundItem[attribute] || []),
              ...(i[attribute] || []),
        ];
      }
    } else {
      result.push(i);
    }
  }

  return result;
};

const result = concatItems(arr, [
  "changedAttributionSectionFields",
  "changedAttributionFields",
]);

console.log("result: ", result);


推荐阅读