我正在尝试通过在sku上进行匹配将array1和array2合并在一起。 但是,如果一个sku有多个(如62617802),我想同时保留array1和array2的值, 例如,第一个sku(62617802)将与array2的第一个sku(62617802)合并,依此类推。
输入注意:如果SKU在array1中重复(如两次或三次,等等),则在array2上也相同。同样,如果array1的计数为5,则array2的计数也为5。
var array1 = [
{
"sku": "35189424",
"price": 107800,
"isNew": false,
"name": "Product Title A"
},
{
"sku": "62617802", // duplicate
"price": 107800,
"isNew": false,
"name": "Product Title D"
},
{
"sku": "GRP00437",
"price": 107800,
"isNew": false,
"name": "Product Title B"
},
{
"sku": "62617802", // duplicate
"price": 107800,
"isNew": false,
"name": "Product Title D"
},
{
"sku": "35189432",
"price": 107800,
"isNew": false,
"name": "Product Title YZ"
}
];
var array2 = [
{
"sku": "35189424",
"Url": "https://......",
"rating": 2,
"status": 0
},
{
"sku": "62617802", // duplicate
"Url": "https://......",
"rating": 5,
"status": 1
},
{
"sku": "GRP00437",
"Url": "https://......",
"rating": 2,
"status": 1
},
{
"sku": "35189432",
"Url": "https://......",
"rating": 3,
"status": 1
},
{
"sku": "62617802", // duplicate
"Url": "https://......",
"rating": 5,
"status": 1
}
];
var outputArray = [
{
"sku": "35189424",
"price": 107800,
"isNew": false,
"name": "Product Title A",
"Url": "https://......",
"rating": 2,
"status": 0
},
{
"sku": "62617802", // duplicate
"price": 107800,
"isNew": false,
"name": "Product Title D",
"Url": "https://......",
"rating": 5,
"status": 1
},
{
"sku": "GRP00437",
"price": 107800,
"isNew": false,
"name": "Product Title B",
"Url": "https://......",
"rating": 2,
"status": 1
},
{
"sku": "62617802", // duplicate
"price": 107800,
"isNew": false,
"name": "Product Title D",
"Url": "https://......",
"rating": 5,
"status": 1
},
{
"sku": "35189432",
"price": 107800,
"isNew": false,
"name": "Product Title YZ",
"Url": "https://......",
"rating": 3,
"status": 1
}
];
答案 0 :(得分:3)
您可以使用一个对象来对相同的sku
和shift
对象进行分组,以保持合并时的相同顺序。
const
array1 = [{ sku: "35189424", price: 107800, isNew: false, name: "Product Title A" }, { sku: "62617802", price: 107800, isNew: false, name: "Product Title D" }, { sku: "GRP00437", price: 107800, isNew: false, name: "Product Title B" }, { sku: "62617802", price: 107800, isNew: false, name: "Product Title D" }, { sku: "35189432", price: 107800, isNew: false, name: "Product Title YZ" }],
array2 = [{ sku: "35189424", Url: "https://......", rating: 2, status: 0 }, { sku: "62617802", Url: "https://......", rating: 5, status: 1 }, { sku: "GRP00437", Url: "https://......", rating: 2, status: 1 }, { sku: "35189432", Url: "https://......", rating: 3, status: 1 }, { sku: "62617802", Url: "https://......", rating: 5, status: 1 }],
skus = array2.reduce((r, o) => ((r[o.sku] = r[o.sku] || []).push(o), r), { }),
result = array1.map(o => ({ ...o, ...skus[o.sku].shift() }));
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
答案 1 :(得分:0)
有很多方法可以做到这一点,这是一种:
both = array1.concat(array2);
const merged = {};
both.forEach(entry => {
!merged[entry.sku] && (merged[entry.sku] = {});
Object.assign(merged[entry.sku], entry);
});
const result = Object.values(merged);
console.log(result);
答案 2 :(得分:0)
所以基本上您需要合并具有相同索引的项目?
var array1 = [{"sku":"35189424","price":107800,"isNew":false,"name":"Product Title A"},{"sku":"62617802","price":107800,"isNew":false,"name":"Product Title D"},{"sku":"GRP00437","price":107800,"isNew":false,"name":"Product Title B"},{"sku":"62617802","price":107800,"isNew":false,"name":"Product Title D"},{"sku":"35189432","price":107800,"isNew":false,"name":"Product Title YZ"}];
var array2 = [{"sku":"35189424","Url":"https://......","rating":2,"status":0},{"sku":"62617802","Url":"https://......","rating":5,"status":1},{"sku":"GRP00437","Url":"https://......","rating":2,"status":1},{"sku":"35189432","Url":"https://......","rating":3,"status":1},{"sku":"62617802","Url":"https://......","rating":5,"status":1}];
console.log(array1.map((item, i) => ({...item, ...array2[i]})))
答案 3 :(得分:0)
let result = array1.reduce((acc, cv) => {
var objj = array2.filter((obj) => obj.sku === cv.sku);
if (!acc.some((item) => item.sku === cv.sku)) {
let p = Object.assign({}, ...[cv], ...objj);
acc.push(p);
}
return acc;
}, []);
答案 4 :(得分:0)
我从@Nina借来了想法,但结构更简单。
const d1 = {};
const d2 = {};
const outputArray = [];
const addElement = (d, el) => {
if (!d[el.sku]) d[el.sku] = [el];
else d[el.sku].push(el)
};
array1.forEach(el => addElement(d1, el));
array2.forEach(el => addElement(d2, el));
for (let k in d1) {
const res = d1[k].map((el, ind) => ({...el, ...d2[k][ind]}));
outputArray.push(...res);
}
console.log(outputArray);