Я не знаю, почему в моем результате для некоторых предметов значение неверно.
var myArray = [{
item: "my apple 1",
value: 1
}, {
item: "my carrot",
value: 2
}, {
item: "my banana",
value: 3
}, {
item: "my potatoe",
value: 4
}, {
item: "my apple 2",
value: 0
}];
var MyArrayDefinition = [{
item: "my apple 1",
color: "red",
group: "fruit",
score: 1
}, {
item: "my carrot",
color: "orange",
group: "vegetable",
score: 0
}, {
item: "my banana",
color: "yellow",
group: "fruit",
score: 1
}, {
item: "my apple 2",
color: "red",
group: "fruit",
score: 0
}, {
item: "my potatoe",
color: "yellow",
group: "vegetable",
score: 0
}, ]
это моя функция, но результат странный для элемента "мое яблоко 2",
var result = [];
myArray.forEach((itm, i) => {
result.push(Object.assign({}, itm, MyArrayDefinition[i]));
мне бы хотелось
[{
item: "my apple 1",
color: "red",
group: "fruit",
score: 1,
value: 1
}, {
item: "my carrot",
color: "orange",
group: "vegetable",
score: 0,
value: 2
}, {
item: "my banana",
color: "yellow",
group: "fruit",
score: 1,
value: 3
}, {
item: "my apple 2",
color: "red",
group: "fruit",
score: 0,
value: 0
}, {
item: "my potatoe",
color: "yellow",
group: "vegetable",
score: 0,
value: 4
}];
Ваш код работает только в том случае, если оба массива имеют одинаковый порядок и длину. Чтобы он был гибким, используйте find()
и сопоставьте второй объект по свойству item.
const myArray = [{item:"my apple 1", value:1},{item:"my carrot", value:2},{item:"my banana", value:3},{item:"my potatoe", value:4},{item:"my apple 2", value:0}];
const MyArrayDefinition = [{item:"my apple 1", color:"red", group:"fruit", score:1},{item:"my carrot", color:"orange", group:"vegetable", score:0},{item:"my banana", color:"yellow", group:"fruit", score:1},{item:"my apple 2", color:"red", group:"fruit", score:0},{item:"my potatoe", color:"yellow", group:"vegetable", score:0},]
const combined = myArray.map(e => Object.assign(e, MyArrayDefinition.find(x => x.item === e.item)));
console.log(combined);
Если оба массива огромны, попробуйте сначала индексировать MyArrayDefinition:
const myArray = [{item:"my apple 1", value:1},{item:"my carrot", value:2},{item:"my banana", value:3},{item:"my potatoe", value:4},{item:"my apple 2", value:0}];
const MyArrayDefinition = [{item:"my apple 1", color:"red", group:"fruit", score:1},{item:"my carrot", color:"orange", group:"vegetable", score:0},{item:"my banana", color:"yellow", group:"fruit", score:1},{item:"my apple 2", color:"red", group:"fruit", score:0},{item:"my potatoe", color:"yellow", group:"vegetable", score:0},]
const indices = MyArrayDefinition.map((e) => e.item);
const comb = myArray.map(e => Object.assign(e, MyArrayDefinition[indices.indexOf(e.item)]));
console.log(comb);
Кажется, что это немного быстрее даже для небольших массивов, поэтому вам нужно извлечь выгоду из этого для сценария реального мира. Проверьте производительность здесь
Ваш фрагмент слияния предполагает массивы, имеющие соответствующие элементы. Т.е.: индекс my apple 2
должен быть одинаковым как в myArray
и в MyArrayDefinition
.
Если вы хотите поддерживать разные наборы и все еще правильно слить, вы можете создать функцию, которая немного похожа на groupBy
. Два важных шага в вашей логике:
Что делает два объекта подходящими для слияния?
В вашем случае: (a, b) => a.item === b.item
Как мы объединяем два объекта?
В вашем случае: (a, b) => Object.assign({}, a, b})
Теперь мы можем (наивно) уменьшить myArray
не беспокоясь о порядке:
var myArray=[{item:"my apple 1",value:1},{item:"my carrot",value:2},{item:"my banana",value:3},{item:"my potatoe",value:4},{item:"my apple 2",value:0}];
var MyArrayDefinition = [{ item: "my apple 1", color: "red", group: "fruit", score: 1 }, { item: "my carrot", color: "orange", group: "vegetable", score: 0 }, { item: "my banana", color: "yellow", group: "fruit", score: 1 }, { item: "my apple 2", color: "red", group: "fruit", score: 0 }, { item: "my potatoe", color: "yellow", group: "vegetable", score: 0 } ];
var merged = myArray.map(
(x) => {
const pair = MyArrayDefinition.find(y => x.item === y.item);
return (Object.assign({}, x, pair || {}));
});
console.log(merged);
Обратите внимание, что эта функция все еще очень неэффективна, потому что она использует find
в каждом цикле. Если вам нужна производительность, вы можете индексировать ваши детали item
ключа первой.
var result = [];
myArray.forEach((itm, i) => {
result.push(Object.assign({}, itm, MyArrayDefinition[i]));
В приведенной выше строке вам просто нужно заменить itm и MyArrayDefinition [i] в методе Object.assign.
как это,
evar result = [];
myArray.forEach((itm, i) => {
result.push(Object.assign({}, MyArrayDefinition[i],itm));