我有一个我想要解决的对象,并通过子对象的id合并某些子元素。因此,不是4个具有重复值的对象,而是只有两个,然后两个将具有合并的子元素数组。
所以这些我的接口和测试用例:
interface ISubElement {
id: number;
price: number;
}
interface IElements {
id: number;
subElements: ISubElement[];
}
interface IElementCollection {
elements: IElements[];
}
const rawObject: IElementCollection = {
elements: [
{
id: 1,
subElements: [
{id: 111, price: 500},
],
},
{
id: 1,
subElements: [
{id: 222, price: 1000},
],
},
{
id: 1,
subElements: [
{id: 333, price: 1500},
],
},
{
id: 2,
subElements: [
{id: 123, price: 700},
],
},
],
};
const expected: IElementCollection = {
elements: [
{
id: 1,
subElements: [
{id: 111, price: 500},
{id: 222, price: 1000},
{id: 333, price: 1500},
],
},
{
id: 2,
subElements: [
{id: 123, price: 700},
],
},
],
};
这是我提出的功能:
const mergeSubElements = (rawCollection: IElementCollection) => {
let mergedCollection: IElementCollection = <IElementCollection> {
elements: [],
};
rawCollection.elements.forEach((element: IElements) => {
console.log('iterating', JSON.stringify(element, null, 4));
const existing = mergedCollection.elements.find((existingElement: IElements) => {
return existingElement.id === element.id;
});
if (existing) {
console.log('should add to existing', JSON.stringify(existing, null, 4));
existing.subElements.concat(element.subElements);
return;
}
mergedCollection.elements.push(element);
});
console.log(JSON.stringify(mergedCollection, null, 4));
return mergedCollection;
};
我的问题似乎是array.prototype.find
只将对象视为值而非参考,即使我concat
字段,它们也不在mergedCollecton
内
如何在打字稿中找到一个对象,而不是每个引用而不是值?
这是我的摩卡测试案例:
describe('it should merge subElements for each element by id', () => {
it('this shall merge', () => {
return expect(mergeSubElements(rawObject)).to.deep.equal(expected);
});
});
答案 0 :(得分:1)
existing.subElements = existing.subElements.concat(element.subElements);
并非find
不会通过引用返回对象,问题出在concat
上:
concat()方法用于合并两个或多个数组。这种方法 不会更改现有数组,而是返回一个新数组。
var arr3 = arr1.concat(arr2);