JavaScript - 合并两个带有重复键的数组

3

我正在尝试通过匹配 sku 将 array1 和 array2 合并在一起。但是如果一个 sku 有多个(比如 62617802),我想保留来自 array1 和 array2 的两个值,例如,第一个 sku(62617802)将与 array2 的第一个 sku(62617802)合并,以此类推。

输入注意:如果在 array1 中 SKU 重复(比如两次或三次等),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
    }
];


输出数组 = [...数组1,...数组2]; - Abror Abdullaev
这个回答解决了你的问题吗?合并对象数组中的重复对象 - Siful Islam
不,看起来我想要保持一个单独的对象,而你的例子将值合并为一个。 - Daniel Smith
5个回答

3
您可以使用对象来对相同的 skushift 对象进行分组,以便在合并时保持相同的顺序。

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; }


如果我想把array1作为主函数保留? - Daniel Smith
好像你的代码对我来说出现了错误。 - Daniel Smith
这是一个逻辑空值赋值 ??=(logical nullish assignment)操作符。请查看编辑。 - Nina Scholz
让我们在聊天中继续此讨论 - Nina Scholz
我有另一个JS问题,如果您能看一下这里就好了:https://stackoverflow.com/questions/68737245/javascript-add-line-break-after-specefic-character-count-with-maximum-line-lim - Daniel Smith
显示剩余6条评论

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);

我有另一个JS问题,如果您能看一下那里就会很有帮助 https://stackoverflow.com/questions/68737245/javascript-add-line-break-after-specefic-character-count-with-maximum-line-lim - Daniel Smith

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]})))


你在哪里按键(SKU)进行映射? - Daniel Smith
我还有一个 JavaScript 的问题,如果您能看一下这里的内容 https://stackoverflow.com/questions/68737245/javascript-add-line-break-after-specefic-character-count-with-maximum-line-lim 那就非常有帮助了。 - Daniel Smith

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;
}, []);

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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接