Создайте новый массив объектов, вставив элементы в массив JavaScript

#javascript #arrays

#javascript #массивы

Вопрос:

У меня есть массив объектов, который выглядит как:

 const orderp = [{id: "1", items:[{id:"1", Name: "Peter"}, {id:"2", Name: "John"}]}, {id: "2", items:[{id:"1", Name: "Teresa"}, {id:"2", Name: "stephan"}]}, {id: "3", items:[{id:"1", Name: "stuart"}, {id:"2", Name: "Jeny"}]}]
  

Теперь для этого я пытаюсь создать объединенный массив, который будет иметь только items значения объектов. Только.

Желаемый результат будет :

 const names = [{id:"1", Name: "Peter"}, {id:"2", Name: "John"},{id:"1", Name: "Teresa"}, {id:"2", Name: "stephan"}, {id:"1", Name: "stuart"}, {id:"2", Name: "Jeny"}]
  

Для этого я попытался:

 let names = []
for (order of orderp) {
  for(name of order['items']) {
    names.push(name)
}
  

}

Еще одна вещь, которая будет использовать итератор числа:

 for(let i =0; i <= orderp.length-1; i   ){

}
  

вот так.

Но есть ли какой-либо способ сделать это?

Спасибо.

Комментарии:

1. Первый фрагмент должен сработать. У вас есть какие-либо ошибки?

Ответ №1:

Вы можете использовать reduce, а внутри обратного вызова использовать concat для объединения массива элементов с массивом аккумуляторов

 let data = [{
  id: "1",
  items: [{
    id: "1",
    Name: "Peter"
  }, {
    id: "2",
    Name: "John"
  }]
}, {
  id: "2",
  items: [{
    id: "1",
    Name: "Teresa"
  }, {
    id: "2",
    Name: "stephan"
  }]
}, {
  id: "3",
  items: [{
    id: "1",
    Name: "stuart"
  }, {
    id: "2",
    Name: "Jeny"
  }]
}];


const newData = data.reduce((acc, curr) => {
 return acc.concat(curr.items)
}, []);
console.log(newData)  

Ответ №2:

Вы можете использовать .flatMap() для этой цели, см. Документацию:

flatMap() Метод возвращает новый массив, сформированный путем применения заданной функции обратного вызова к каждому элементу массива, а затем выравнивания результата на один уровень. Он идентичен a, за которым map() следует a flat() , с глубиной 1, но немного более эффективен, чем вызов этих двух методов по отдельности.

Попробуйте выполнить следующее:

 const orderp = [{id: "1", items:[{id:"1", Name: "Peter"}, {id:"2", Name: "John"}]}, {id: "2", items:[{id:"1", Name: "Teresa"}, {id:"2", Name: "stephan"}]}, {id: "3", items:[{id:"1", Name: "stuart"}, {id:"2", Name: "Jeny"}]}]
const names = orderp.flatMap(e => e.items)
console.log(names)  

Ответ №3:

Это также можно сделать с помощью функции отображения массива

 const orderp = [
    { id: '1', items: [ { id: '1', Name: 'Peter' }, { id: '2', Name: 'John' }]},{ id: '2', items: [ { id: '1', Name: 'Teresa' }, { id: '2', Name: 'stephan' } ] },{ id: '3', items: [ { id: '1', Name: 'stuart' }, { id: '2', Name: 'Jeny' } ] }];
        let arr = [];
        orderp.map((item) => {
            if (item['items']) {
                if (Object.entries(item['items'].length > 1)) {
                    Object.entries(item['items']).map((item) => {
                        arr.push(item[1]);
                    });
                } else {
                    arr.push(item[1]);
                }
            }
        });
        console.log(arr);