L oop через каждый объект в массиве массивов найти идентификатор, сопоставить его с другим объектом в массиве и объединить их вместе - PullRequest
2 голосов
/ 27 апреля 2020

Итак, у меня есть массив с именем «products», который содержит объекты, и каждый объект имеет уникальный идентификатор. У меня также есть другой массив с именем «productsAdditionalInfo», который содержит дополнительную информацию, относящуюся к «products», и у каждого объекта есть owner_id, который соответствует одному из объектов в массиве «products». 'ProductsAdditionalInfo' может иметь много объектов внутри массива, но всегда будет иметь один и тот же owner_id относительно этого массива.

Я пытаюсь l oop через массив 'productsAdditionalInfo' получить 'owner_id' и сопоставить его с 'id' в массиве products, затем добавить пространство имен в качестве ключа и значение как значение, а затем вернуть его в качестве нового массива. Однако, похоже, я застрял на первом препятствии. Я получаю первый ключ «Duration» в консоли, затем я получаю «namespace» из undefined.

Надеюсь, это имеет смысл, если я не закомментировал пример того, как это должно быть. Я ценю любую помощь.

Изменить: Некоторые люди предположили, что это похоже / так же, как другой вопрос , где вы объединяете их вместе, но я считаю, что мой вопрос отличается, так как я не полностью объединяю их вместе просто определенные биты информации.

let products = [ {id: 102, type: "toy"}, {id: 245, type: "food"}, {id: 312, type: "clothes"} ]

let productsAdditionalInfo = [ 
  [{namespace: "Duration", value: 5, owner_id: 245}, {namespace: "effect", value: "Tail", owner_id: 245}], 
  [{namespace: "Supplier", owner_id: 312, value: "rev"}], 
  [{namespace: "amount", value: 0, owner_id: 102}, {namespace: "effect", value: "plush", owner_id: 102}] 
]

$.each(productsAdditionalInfo, function( index, product ) {
  console.log( product[index].namespace );
});


// let whatItShouldBe = [ {id: 102, type: "toy", amount: 0, effect: "plush" }, {id: 245, type: "food", Duration: 5, effect: "Tail"}, {id: 312,  type: "clothes", Supplier: "rev"} ]
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

Ответы [ 2 ]

1 голос
/ 27 апреля 2020

let products = [ {id: 102, type: "toy"}, {id: 245, type: "food"}, {id: 312, type: "clothes"} ]

let productsAdditionalInfo = [ 
  [{namespace: "Duration", value: 5, owner_id: 245}, {namespace: "effect", value: "Tail", owner_id: 245}], 
  [{namespace: "Supplier", owner_id: 312, value: "rev"}], 
  [{namespace: "amount", value: 0, owner_id: 102}, {namespace: "effect", value: "plush", owner_id: 102}] 
]

const flatPAI = productsAdditionalInfo.flat();

console.log(
products.map( p => 
  Object.assign(p,
    ...flatPAI.filter(
         info => info.owner_id == p.id
       ).map(
         info => ({[info.namespace]: info.value})))
)
);



// let whatItShouldBe = [ {id: 102, type: "toy", amount: 0, effect: "plush" }, {id: 245, type: "food", Duration: 5, effect: "Tail"}, {id: 312,  type: "clothes", Supplier: "rev"} ]
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
1 голос
/ 27 апреля 2020

Одним из способов достижения этого было бы l oop через каждый продукт, извлекая связанный productAdditionsInfo на основе owner_id. Оттуда вы можете создать объект из дополнений и объединить их вместе, что-то вроде этого:

let products = [{id: 102, type: "toy"}, {id: 245, type: "food"}, {id: 312, type: "clothes"}]
let productsAdditionalInfo = [ 
  [{namespace: "Duration", value: 5, owner_id: 245}, {namespace: "effect", value: "Tail", owner_id: 245}], 
  [{namespace: "Supplier", owner_id: 312, value: "rev"}], 
  [{namespace: "amount", value: 0, owner_id: 102}, {namespace: "effect", value: "plush", owner_id: 102}] 
]

let merged = products.map(p => {
  var info = productsAdditionalInfo.filter(i => i[0].owner_id == p.id)[0].map(i => ({ [i.namespace]: i.value }));
  info.push(p);
  return Object.assign(...info);
});

console.log(merged);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

Предполагается, что массивы второго уровня в productsAdditionalInfo всегда сгруппированы по одному и тому же owner_id.

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