используйте Object.assign () в каждом объекте

1

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

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
}];
  • 0
    «результат странный» - пожалуйста, определите странный и / или покажите результат, который он вам дает
  • 0
    Порядок вашего картофеля и яблока не совпадают в обоих массивах.
Теги:
object
arrays

3 ответа

1
Лучший ответ

Ваш код работает только в том случае, если оба массива имеют одинаковый порядок и длину. Чтобы он был гибким, используйте 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);

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

1

Ваш фрагмент слияния предполагает массивы, имеющие соответствующие элементы. Т.е.: индекс 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 ключа первой.

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню