создайте новый массив из массива и ваше свойство, которое содержит другой массив - PullRequest
0 голосов
/ 21 мая 2018

Мне нужно создать новый массив из массива и ваше свойство, содержащее другой массив:

bigArray = [
    {
     bigArrayID : 1,
     name: 'Xpto',
     children: [
         {childID:1,Name:'XptoChild1'},
         {childID:2,Name:'XptoChild2'},
     ]
    },
    {
     bigArrayID : 2,
     name: 'Foo',
     children: [
         {childID:3,Name:'FooChild1'},
         {childID:4,Name:'FooChild2'},
     ]
    },
    {
     bigArrayID : 3,
     name: 'Bar',
     children: [
         {childID:5,Name:'BarChild1'},
         {childID:6,Name:'BarChild2'},
     ]
    }
]

превратить bigArray в результат, например:

result = [
            {
             bigArrayID : 1,
             name: 'Xpto',
             children: [
                 {childID:1,Name:'XptoChild1'},
                 {childID:2,Name:'XptoChild2'},
             ]
            },
            {childID:1,Name:'XptoChild1'},
            {childID:2,Name:'XptoChild2'},
            {
             bigArrayID : 2,
             name: 'Foo',
             children: [
                 {childID:3,Name:'FooChild1'},
                 {childID:4,Name:'FooChild2'},
             ]
            },
            {childID:3,Name:'FooChild1'},
            {childID:4,Name:'FooChild2'},
            {
             bigArrayID : 3,
             name: 'Bar',
             children: [
                 {childID:5,Name:'BarChild1'},
                 {childID:6,Name:'BarChild2'},
             ]
            },
            {childID:5,Name:'BarChild1'},
            {childID:6,Name:'BarChild2'}
        ]

Каждый дочерний элемент должен быть элементом вновый массив.

Мне нужен новый массив со всем отцом и всем потомком в качестве объекта.

Мне нужно превратить ребенка как родного брата вашего отца в новый массив.

Я думаюМне нужно использовать конкат и / или функцию распределенного массива ...

Ответы [ 4 ]

0 голосов
/ 21 мая 2018

Array#reduce в Array#concat известен как Array#flatMap, который в настоящее время находится на стадии 3.Это также известно как #chain согласно спецификации Fantasy Land Monad .

Вы можете использовать его следующим образом

const result =
  bigArray .flatMap
    (node => [ node, ...node.children ])

console.log (result)
// [ { bigArrayID: 1, name: 'Xpto', children: [ ... ] }
// , { childID: 1, name: 'XptoChild1' }
// , { childID: 2, name: 'XptoChild2' }
// , { bigArrayID: 2, name: 'Foo', children: [ ... ] }
// , { childID: 3, name: 'FooChild1' }
// , { childID: 4, name: 'FooChild2' }
// , { bigArrayID: 3, name: 'Bar', children: [ ... ] }
// , { childID: 5, name: 'BarChild1' }
// , { childID: 6, name: 'BarChild2' }
// ]

Если его нет в вашей среде, вы можете легко заполнить его

Array.prototype.flatMap = function (f)
  { return this.reduce
      ( (acc, x) =>
          acc .concat (f (x))
      , []
      )
  }

Запустить полную демонстрациюпрограммы в вашем браузере ниже

Array.prototype.flatMap = function (f)
  { return this.reduce
      ( (acc, x) =>
          acc .concat (f (x))
      , []
      )
  }

const bigArray =
  [ { bigArrayID: 1
    , name: "Xpto"
    , children:
        [ { childID: 1, name: "XptoChild1" }
        , { childID: 2, name: "XptoChild2" }
        ]
    }
  , { bigArrayID: 2
    , name: "Foo"
    , children:
        [ { childID: 3, name: "FooChild1" }
        , { childID: 4, name: "FooChild2" }
        ]
    }
  , { bigArrayID: 3
    , name: "Bar"
    , children:
      [ { childID: 5, name: "BarChild1" }
      , { childID: 6, name: "BarChild2" }
      ]
    }
  ]

const result =
  bigArray .flatMap
    (node => [ node, ...node.children ])

console.log (result)
// [ { bigArrayID: 1, name: 'Xpto', children: [ ... ] }
// , { childID: 1, name: 'XptoChild1' }
// , { childID: 2, name: 'XptoChild2' }
// , { bigArrayID: 2, name: 'Foo', children: [ ... ] }
// , { childID: 3, name: 'FooChild1' }
// , { childID: 4, name: 'FooChild2' }
// , { bigArrayID: 3, name: 'Bar', children: [ ... ] }
// , { childID: 5, name: 'BarChild1' }
// , { childID: 6, name: 'BarChild2' }
// ]

Если вам нужны индексы и переключение контекста, такие как Array#map и Array#reduce и Array#filter, вы можете добавить их тоже

Array.prototype.flatMap = function (f, context)
  { return this.reduce
      ( (acc, x, i) =>
          acc .concat (f .call (context, x, i, this))
      , []
      )
  }
0 голосов
/ 21 мая 2018

Оригинал

var resultArray = bigArray.concat(bigArray.map(function(item) {
  return item.children;
})

С заказом

var result = [];
for(var i = 0; i < bigArray.length; i++) {
  result.push(bigArray[i]);
  for( var y = 0; y < bigArray[i].children.length; y++) {
    result.push(bigArray[i].children[y]);
  }
}

С функциональным программированием и заказом

var result = [];
bigArray.forEach(function(item) {
  result.push(item);
  item.forEach(result.push);
})
0 голосов
/ 21 мая 2018

Не уверен, правильно ли я понимаю ваш вопрос, но мне кажется, что вы хотите сгладить иерархию?Если порядок на самом деле не важен, то может помочь следующее решениес отцом в единый массив

0 голосов
/ 21 мая 2018

Да, вы правы, вы можете использовать Array#reduce(), а затем Array#concat() каждый элемент и его дочерние элементы для аккумулятора в обратном вызове:

const bigArray = [{"bigArrayID":1,"name":"Xpto","children":[{"childID":1,"Name":"XptoChild1"},{"childID":2,"Name":"XptoChild2"}]},{"bigArrayID":2,"name":"Foo","children":[{"childID":3,"Name":"FooChild1"},{"childID":4,"Name":"FooChild2"}]},{"bigArrayID":3,"name":"Bar","children":[{"childID":5,"Name":"BarChild1"},{"childID":6,"Name":"BarChild2"}]}]
const result = bigArray.reduce(
  (result, element) => result.concat(element, element.children),
  []
)

// stringify is simply to prevent side-effects
// of stack snippet console behavior
console.log(JSON.stringify(result, null, 2))
...