Мне нужно обернуть каждый элемент массива, даже дочерние элементы, я работаю с JavaScript - PullRequest
0 голосов
/ 05 марта 2020

Мне нужно обернуть каждый элемент массива, даже элементы дочерних элементов.

input:

var array = [
{"name":"name1"},
{"name":"name2"},
{"name":"name3", children : [{"id":"1"}]}];

Желаемый вывод:

var newArray = [
{elem : {"name":"name1"}},
{elem : {"name":"name2"}},
{elem : {"name":"name3", children : [{elem : {"id":"1"}}]}}];

У меня есть сделано следующее:

function insertKey(array){
    for (var i = 0; i<array.length; i++){
        tempItem = {elem : array[i]}
        newarray.push(tempItem);
    }
}

// Вывод:

 newarray = 
[{elem:{"name":"name1"}},
 {elem:{"name":"name2"}},
 {elem:{"name":"name3"}}]

Но проблема возникает, когда он содержит детей. Я попробовал ниже, но это не работает.

function insertKey(array){
    for (var i = 0; i<array.length; i++){
        tempItem = {elem : array[i]}
        newarray.push(tempItem);
        insertKey(array[i]);
    }

}

Заранее спасибо.

Ответы [ 3 ]

1 голос
/ 05 марта 2020

Чтобы сделать это для любого уровня вложенности, мы можем использовать довольно простой рекурсивный подход:

const transform = (xs) =>
  xs .map (({children, ...rest}) => ({
    elem:  {
      ...rest,
      ...(children ? {children: transform (children)} : {})
    }
  }))

Но я думаю, что один уровень абстракции значительно улучшает это. Если мы отделим бит, который оборачивает узел в структуре {elem: ...}, от бита, который применяет это рекурсивно, наш код будет и более простым, и более пригодным для повторного использования. Его проблемы лучше разделены. Так что я, вероятно, написал бы это так:

const mapDeep = (fn) => (xs) =>
  xs .map (({children, ...rest}) => fn ({
    ...rest,
    ...(children ? {children: mapDeep (fn) (children)} : {})
  }))

const data = [
  {name:"name1"},
  {name:"name2"},
  {name:"name3", children : [
    {id: "1"}, 
    {id: "2", children: [ {foo: "bar"}, {foo: "baz"} ]}
  ]}
]

const wrapInElem = (node) => ({elem: node})

console .log (mapDeep (wrapInElem) (data))

И, конечно, передав только mapDeep только функцию, мы получаем функцию многократного использования, которая делает то, что вы хотите:

const transform = mapDeep (wrapInElem) 
// or, using an anonymous function instead 
// const transform = mapDeep (node => ({elem: node})) 
// ...
transform (data)
0 голосов
/ 05 марта 2020

Звучит так, будто вы хотите что-то вроде этого:

function insertKey(array) {
    const newarray = [];
    for (let i = 0; i < array.length; i++) {
        const tempItem = {elem : array[i]};
        if (array[i].children) {
            tempItem.children = array[i].children.map(child => ({elem: child}));
        }
        newarray.push(tempItem);
    }
    return newarray;
}

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

const newarray = insertKey(array);

Редактировать: Обратите внимание, что это решение работает только для одного уровня вложенности. Если вам нужно глубже go, ваш вопрос (как указано) не дает нам достаточной информации, чтобы помочь, потому что мы не знаем схему данных, которые вы пытаетесь обернуть.

0 голосов
/ 05 марта 2020

вы можете попробовать перебрать каждый объект массива и добавить их в новый массив. Это дает желаемый результат. определить функцию как: -

function f(array){
newArray=[]
for(i of array){
newArray.push({elem:i})
}
return newArray
}

var array = [
{"name":"name1"},
{"name":"name2"},
{"name":"name3", children : [{"id":"1"}]}];

newArray=f(array)
console.log(newArray)
...