Создать родительские и дочерние отношения, используя lodash - PullRequest
0 голосов
/ 25 мая 2018

Объедините родительский и chid JSON-массивы на основе значения индекса и добавьте в него еще один найденный атрибут.

Данные: поле сравнения: parentJSON - индекс childJSON - parent_index

Вывод: - родительский- и его дети - родитель - и его дети

parentJSON:
[{ index:1, name: 'a'}, {index:2, name: 'b'}, {index:3, name: 'c'}, {index:4, name: 'd'}]

childJSON:
[
  { index:1, name: 'aa', parent_index:1}, 
  {index:2, name: 'ab', parent_index:1}, 
  {index:3, name: 'ba', parent_index: 2}, 
  {index:4, name: 'bb', parent_index: 2}, 
  {index:5, name: 'ca', parent_index: 3}, 
  {index:6, name: 'ad', parent_index: 1}
]

output:
[
  { index:1, name: 'a'},
  { index:1, name: 'aa', parent_index:1, found: true}, 
  { index:2, name: 'ab', parent_index:1, found: true},
  { index:6, name: 'ad', parent_index:1, found: true},
  { index:2, name: 'b'},
  { index:3, name: 'ba', parent_index:2, found: true}, 
  { index:4, name: 'bb', parent_index:2, found: true},
  { index:3, name: 'c'},
  { index:5, name: 'ca', parent_index:3, found: true},
  { index:4, name: 'd'},
]

Plunker Link

Ответы [ 4 ]

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

Поскольку вы используете lodash , я оставлю мое решение полностью в lodash.

Шаги по решению этой проблемы будут:

  1. Для сопоставления childJSON, чтобы проверить, существует ли индекс их родителя или нет

  2. Объединить оба массива jsons в один.

  3. Сортируйте их по name в порядке возрастания.

Запись в коде будет такой:

var childJSON = [
  { index:1, name: 'aa', parent_index:1}, 
  {index:2, name: 'ab', parent_index:1}, 
  {index:3, name: 'ba', parent_index: 2}, 
  {index:4, name: 'bb', parent_index: 2}, 
  {index:5, name: 'ca', parent_index: 3}, 
  {index:6, name: 'ad', parent_index: 1}
];

var parentJSON = [
   { index:1, name: 'a'},
   {index:2, name: 'b'}, 
   {index:3, name: 'c'}, 
   {index:4, name: 'd'}
   ];


childJSON = _.map(childJSON, function(child) {
    child.found = !!_.find(parentJSON, {index: child.parent_index});
    return child;
});

var newArray = _.concat(childJSON, parentJSON);
newArray = _.sortBy(newArray, ['name']);

console.log(newArray);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.js"></script>
0 голосов
/ 25 мая 2018

Вы можете объединить их в один массив, затем отсортировать по parent_index или по индексу

let par = [{ index:1, name: 'a'}, {index:2, name: 'b'}, {index:3, name: 'c'}, {index:4, name: 'd'}]
let child = [{ index:1, name: 'aa', parent_index:1}, {index:2, name: 'ab', parent_index:1}, {index:3, name: 'ba', parent_index: 2}, {index:4, name: 'bb', parent_index: 2}, {index:5, name: 'ca', parent_index: 3}, {index:6, name: 'ad', parent_index: 1}]

let res = [...par, ...child].sort((a, b) => (a.parent_index || a.index) - (b.parent_index || b.index) );
console.log(res);
0 голосов
/ 25 мая 2018

let parentJSON =
[{ index:1, name: 'a'}, {index:2, name: 'b'}, {index:3, name: 'c'}, {index:4, name: 'd'}]

let childJSON =
[
  { index:1, name: 'aa', parent_index:1}, 
  {index:2, name: 'ab', parent_index:1}, 
  {index:3, name: 'ba', parent_index: 2}, 
  {index:4, name: 'bb', parent_index: 2}, 
  {index:5, name: 'ca', parent_index: 3}, 
  {index:6, name: 'ad', parent_index: 1}
]

let answer = [];

parentJSON.forEach(parent => {
  answer.push(parent);
  
  childJSON.forEach(child => {
  	if(child.parent_index === parent.index){
    	child.found = true;
      
      answer.push(child);
    }
  })
});

console.log(answer)

Не зная, как вы ожидаете получить childJSON, которого нет в parentJSON, вышеприведенное решение сделало предположение, что все элементы childJSON имеютparent_index ссылка на parentJSON.

Дайте мне знать, если вы обновили свой вопрос, если это не то, что вы хотите

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

Сопоставить дочерний массив с объектом или Картой, используя parent_index в качестве ключей

Затем выполните итерации родительского массива и проверьте приведенную выше карту на наличие дочерних элементов для включения

var childMap = childJSON.reduce((a,c)=> a.set(c.parent_index, (a.get(c.parent_index)|| []).concat(c)),new Map)

var res = parentJSON.reduce((a,c)=>{
  a.push(c)
  if(childMap.has(c.index)){
    return a.concat(...childMap.get(c.index))
  }
  return a;
},[])

console.log(res)
.as-console-wrapper {max-height: 100%!important;}
<script>
var parentJSON = [{
  "index": 0,
  "parent_name": "Cline Walters"
}, {
  "index": 1,
  "parent_name": "Tommie Hoover"
}, {
  "index": 2,
  "parent_name": "Rosalie Foreman"
}, {
  "index": 3,
  "parent_name": "Sutton Garza"
}, {
  "index": 4,
  "parent_name": "Vega Estrada"
}, {
  "index": 5,
  "parent_name": "Ballard Long"
}, {
  "index": 6,
  "parent_name": "Ernestine Dalton"
}];

var childJSON = [{
  "index": 0,
  "child_name": "Keisha Simmons",
  "parent_index": 0
}, {
  "index": 1,
  "child_name": "Lane Walsh",
  "parent_index": 0
}, {
  "index": 2,
  "child_name": "Jocelyn Chapman",
  "parent_index": 1
}, {
  "index": 3,
  "child_name": "Weaver Welch",
  "parent_index": 1
}, {
  "index": 4,
  "child_name": "Short Jarvis",
  "parent_index": 2
}, {
  "index": 5,
  "child_name": "Dotson Washington",
  "parent_index": 3
}, {
  "index": 6,
  "child_name": "Pate Bradley",
  "parent_index": 4
}];
</script>
...