javascript - 如何根据 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 值的对象。有什么建议吗?
解决方案
这是关于 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);
推荐阅读
- python - 为什么 Python 在覆盖文件时会在文件开头添加不必要的字符?
- android - getResources().getStringArray 发生本机崩溃
- postgresql - 从 PostgreSQL 中的多个查询结果创建计算的枢轴
- html - 文本上的渐变叠加
- javascript - 如何在 Winstonjs 记录器中记录 Unhandled TimeoutError?
- python - / 字符串索引处的 TypeError 必须是整数
- android - 如何使用已知的屏幕密码自动解锁手机?
- sql-server - 表上的自动索引
- sharepoint-2013 - 使用 CSOM 的 SharePoint Office365 登录问题
- javascript - Artyom.js 立即禁用自身