合并来自不同数组的对象
Merging objects from different arrays
我正在做一些事情,从我无法控制的 2 个不同的 API 获取数据,我想以最有效的方式组合结果。
其中一个数组持有一些资产,比方说书籍,另一个持有所述书籍的交易。这是一个例子:
{
author: {name: 'J.K. Rowling', },
assetName: 'Book1'
}]
const array2 = [
{from: 'John',
to: 'Sarah,
price: 10,
timeStamp: 123,
assetName: 'Book1',
authorName: 'J.K. Rowling'
}]
请注意,要找到给定图书的相应交易,您需要 assetName 和 authorName 匹配 - 您可以拥有同一作者的多本书,并且可以拥有两本同名但作者不同的书,但一位作者只有一本同名的书,因此找到与资产对应的交易需要两个字段都匹配,并且没有其他唯一标识符。
天真的方法是遍历一个数组,并为每个条目检查第二个数组以找到交易,但如果数组很大,这看起来执行起来会花费太长时间。
我想知道您能想到什么更好的解决方案来有效地合并两个具有不同结构的对象?
好吧,如果 author.name
+ assetName
形成一个 id,您可以迭代 array1
一次并创建一个 Map
,键为 author.name + assetName
&值是原始对象。
然后您也可以迭代 array2
一次并以任何您想要的方式丰富它。第二次迭代中的所有查找都会很快,因为您将访问 Map
而不是在数组中搜索。
const indexedArray1 = new Map();
array1.forEach(data => indexedArray1.set(data.author.name + data.assetName, data);
const enrichedArray2 = array2.map(transaction => {
const relatedBook = indexedArray1.get(transaction.authorName + transaction.assetName);
// Merge relatedBook & transaction the way you want here
});
我在合并数组的时候经常做下面的事情
时间复杂度为O(n)
const array1 = [{
author: {name: 'J.K. Rowling' },
assetName: 'Book1'
}]
const array2 = [{
from: 'John',
to: 'Sarah',
price: 10,
timeStamp: 123,
assetName: 'Book1',
authorName: 'J.K. Rowling'
}]
const array2_map = {}
array2.forEach(e => {
const key = `${e.assetName}:${e.authorName}`
if (!array2_map[key]) array2_map[key] = []
const { from, to, price, timeStamp } = e
array2_map[key].push({
from,
to,
price,
timeStamp
})
})
const merged_array = array1.map(e => ({
...e,
transaction: array2_map[`${e.assetName}:${e.authorName}`] || []
}))
我正在做一些事情,从我无法控制的 2 个不同的 API 获取数据,我想以最有效的方式组合结果。 其中一个数组持有一些资产,比方说书籍,另一个持有所述书籍的交易。这是一个例子:
{
author: {name: 'J.K. Rowling', },
assetName: 'Book1'
}]
const array2 = [
{from: 'John',
to: 'Sarah,
price: 10,
timeStamp: 123,
assetName: 'Book1',
authorName: 'J.K. Rowling'
}]
请注意,要找到给定图书的相应交易,您需要 assetName 和 authorName 匹配 - 您可以拥有同一作者的多本书,并且可以拥有两本同名但作者不同的书,但一位作者只有一本同名的书,因此找到与资产对应的交易需要两个字段都匹配,并且没有其他唯一标识符。 天真的方法是遍历一个数组,并为每个条目检查第二个数组以找到交易,但如果数组很大,这看起来执行起来会花费太长时间。 我想知道您能想到什么更好的解决方案来有效地合并两个具有不同结构的对象?
好吧,如果 author.name
+ assetName
形成一个 id,您可以迭代 array1
一次并创建一个 Map
,键为 author.name + assetName
&值是原始对象。
然后您也可以迭代 array2
一次并以任何您想要的方式丰富它。第二次迭代中的所有查找都会很快,因为您将访问 Map
而不是在数组中搜索。
const indexedArray1 = new Map();
array1.forEach(data => indexedArray1.set(data.author.name + data.assetName, data);
const enrichedArray2 = array2.map(transaction => {
const relatedBook = indexedArray1.get(transaction.authorName + transaction.assetName);
// Merge relatedBook & transaction the way you want here
});
我在合并数组的时候经常做下面的事情
时间复杂度为O(n)
const array1 = [{
author: {name: 'J.K. Rowling' },
assetName: 'Book1'
}]
const array2 = [{
from: 'John',
to: 'Sarah',
price: 10,
timeStamp: 123,
assetName: 'Book1',
authorName: 'J.K. Rowling'
}]
const array2_map = {}
array2.forEach(e => {
const key = `${e.assetName}:${e.authorName}`
if (!array2_map[key]) array2_map[key] = []
const { from, to, price, timeStamp } = e
array2_map[key].push({
from,
to,
price,
timeStamp
})
})
const merged_array = array1.map(e => ({
...e,
transaction: array2_map[`${e.assetName}:${e.authorName}`] || []
}))