используйте Object.assign () в каждом объекте - PullRequest
0 голосов
/ 08 июня 2018

Я не знаю, почему в моем результате для некоторых элементов значение неверное.

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

Ответы [ 3 ]

0 голосов
/ 08 июня 2018

Ваш фрагмент объединения предполагает использование массивов с соответствующими элементами.То есть: индекс my apple 2 должен быть одинаковым как в myArray, так и в MyArrayDefinition.

. Если вы хотите поддерживать различные наборы и все еще корректно объединяться, вы можете создать функцию, которая работает немногокак groupBy.Два важных шага в вашей логике:

  1. Что делает два объекта пригодными для слияния?
    В вашем случае: (a, b) => a.item === b.item

  2. Как объединить два объекта?
    В вашем случае: (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.

0 голосов
/ 08 июня 2018
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));
0 голосов
/ 08 июня 2018

Ваш код работает, только если оба массива имеют одинаковый порядок и длину.Чтобы сделать его более гибким, используйте find() и сопоставьте второй объект по свойству элемента.

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

Кажется, что это немного быстрее, даже для небольших массивов, поэтому вы должны извлечь из этого пользу для сценария реального мира. Проверьте производительность здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...