合并 2 个数组并使用 lodash 替换相同的键
merge 2 array and replace same key using lodash
我有这 2 个数组,
const firstArray = [
{
key: 'a',
value: 'a'
},
{
key: 'b',
value: 'b'
},
{
key: 'c',
value: 'c'
}
]
const secondArray = [
{
key: 'b',
value: 'd'
},
{
key: 'c',
value: 'e'
}
]
我想合并这两个数组,如果在第二个数组上找到相同的键,第二个数组值将替换第一个数组值
新数组应该如下所示
const expectedArray = [
{
key: 'a',
value: 'a'
},
{
key: 'b',
value: 'd'
},
{
key: 'c',
value: 'e'
}
]
正如我在您的标签中看到 lodash
,我假设您想要使用它。
你可以这样使用:
var merged = _(firstArray)
.concat(secondArray)
.groupBy("key")
.map(_.spread(_.merge))
.value();
它基本上将具有相同键的所有对象分组到一个 groupBy("key")
的数组中,然后将每个值数组展平并合并它们并使用最后一个 .map(_.spread(_.merge))
.
我建议把最后的点赞注释掉,如果你想完全理解这个过程,请查看所有中间步骤,这很有趣!
const firstArray = [{
key: 'a',
value: 'a'
},
{
key: 'b',
value: 'b'
},
{
key: 'c',
value: 'c'
}
]
const secondArray = [{
key: 'b',
value: 'd'
},
{
key: 'c',
value: 'e'
}
]
var merged = _(firstArray)
.concat(secondArray)
.groupBy("key")
.map(_.spread(_.merge))
.value();
console.log(merged);
<script src="https://cdn.jsdelivr.net/lodash/4.13.1/lodash.min.js"></script>
const mergedArray = [...secondArray, ...firstArray];
const lengthOfUniqueArray = new Set(mergedArray.map((item) => item.key)).size;
const expectedArray = newArray.slice(0, lengthOfUniqueArray);
expectedArray
就是你想要的。
没有 lodash
的解决方案是遍历第二个数组并只查找匹配项。
如果没有匹配项,将项目推入第一个数组。
如果匹配,则将第一个数组中的项目替换为第二个数组中的项目。
const mergedArray = [...firstArray]
secondArray.forEach(newItem => {
const matchIndex = mergedArray.findIndex(prevItem => prevItem.key === newItem.key)
if (matchIndex === -1) {
mergedArray.push(newItem)
} else {
mergedArray[matchIndex] = newItem
}
})
您可以通过键连接、反转、可以所有唯一元素,然后反转回来:
const { flow, concat, reverse, uniqBy } = _
const mergeArrays = flow(
concat,
reverse,
arr => uniqBy(arr, 'key'),
reverse
)
const firstArray = [{"key":"a","value":"a"},{"key":"b","value":"b"},{"key":"c","value":"c"}]
const secondArray = [{"key":"b","value":"d"},{"key":"c","value":"e"}]
var merged = mergeArrays(firstArray, secondArray)
console.log(merged)
<script src="https://cdn.jsdelivr.net/lodash/4.13.1/lodash.min.js"></script>
我有这 2 个数组,
const firstArray = [
{
key: 'a',
value: 'a'
},
{
key: 'b',
value: 'b'
},
{
key: 'c',
value: 'c'
}
]
const secondArray = [
{
key: 'b',
value: 'd'
},
{
key: 'c',
value: 'e'
}
]
我想合并这两个数组,如果在第二个数组上找到相同的键,第二个数组值将替换第一个数组值
新数组应该如下所示
const expectedArray = [
{
key: 'a',
value: 'a'
},
{
key: 'b',
value: 'd'
},
{
key: 'c',
value: 'e'
}
]
正如我在您的标签中看到 lodash
,我假设您想要使用它。
你可以这样使用:
var merged = _(firstArray)
.concat(secondArray)
.groupBy("key")
.map(_.spread(_.merge))
.value();
它基本上将具有相同键的所有对象分组到一个 groupBy("key")
的数组中,然后将每个值数组展平并合并它们并使用最后一个 .map(_.spread(_.merge))
.
我建议把最后的点赞注释掉,如果你想完全理解这个过程,请查看所有中间步骤,这很有趣!
const firstArray = [{
key: 'a',
value: 'a'
},
{
key: 'b',
value: 'b'
},
{
key: 'c',
value: 'c'
}
]
const secondArray = [{
key: 'b',
value: 'd'
},
{
key: 'c',
value: 'e'
}
]
var merged = _(firstArray)
.concat(secondArray)
.groupBy("key")
.map(_.spread(_.merge))
.value();
console.log(merged);
<script src="https://cdn.jsdelivr.net/lodash/4.13.1/lodash.min.js"></script>
const mergedArray = [...secondArray, ...firstArray];
const lengthOfUniqueArray = new Set(mergedArray.map((item) => item.key)).size;
const expectedArray = newArray.slice(0, lengthOfUniqueArray);
expectedArray
就是你想要的。
没有 lodash
的解决方案是遍历第二个数组并只查找匹配项。
如果没有匹配项,将项目推入第一个数组。
如果匹配,则将第一个数组中的项目替换为第二个数组中的项目。
const mergedArray = [...firstArray]
secondArray.forEach(newItem => {
const matchIndex = mergedArray.findIndex(prevItem => prevItem.key === newItem.key)
if (matchIndex === -1) {
mergedArray.push(newItem)
} else {
mergedArray[matchIndex] = newItem
}
})
您可以通过键连接、反转、可以所有唯一元素,然后反转回来:
const { flow, concat, reverse, uniqBy } = _
const mergeArrays = flow(
concat,
reverse,
arr => uniqBy(arr, 'key'),
reverse
)
const firstArray = [{"key":"a","value":"a"},{"key":"b","value":"b"},{"key":"c","value":"c"}]
const secondArray = [{"key":"b","value":"d"},{"key":"c","value":"e"}]
var merged = mergeArrays(firstArray, secondArray)
console.log(merged)
<script src="https://cdn.jsdelivr.net/lodash/4.13.1/lodash.min.js"></script>