Как объединить несколько массивов jsons в один массив пересечь с подмассива в JavaScript? - PullRequest
0 голосов
/ 28 сентября 2018

У меня есть два массива json:

 1) 
   [
    {
     "userId": 9
    },
    {
      "userId": 14
     }
    ]

 2) 
   [{"role": "1", "group": "3"}, {"role": "1", "group": "2"}] 

Я хотел бы объединить два массива следующим образом: Возможно ли получить решение с помощью JavaScript?

[
 {"userId":9,"role":"1","group":"2"},
 {"userId":14,"role":"1","group":"2"}
 {"userId":9,"role":"1","group":"3"},
 {"userId":14,"role":"1","group":"3"}
] 

Я пыталсяиспользовать let однако я не смог найти способ манипулировать переключением подмассива:

let arr1 = [{"userId": 9}, {"userId": 14}];
let arr2 = [{"role": "1", "group": "3"}, {"role": "1", "group": "2"}];

let result = arr1.map(o => Object.assign(o, ...arr2));

console.log(result);
return result;

Результат, который я получил с предыдущей реализацией, выглядит так:

[{"userId":9,"role":"1","group":"2"},{"userId":14,"role":"1","group":"2"}] 

ОднакоЯ хотел бы получить результат следующим образом:

[
 {"userId":9,"role":"1","group":"2"},
 {"userId":14,"role":"1","group":"2"}
 {"userId":9,"role":"1","group":"3"},
 {"userId":14,"role":"1","group":"3"}
]

Ответы [ 6 ]

0 голосов
/ 28 сентября 2018

Здесь краткий подход для произвольного подсчета массивов объектов.

var array1 = [{ userId: 9 }, { userId: 14 }],
    array2 = [{ role: "1", group: "3" }, { role: "1", group: "2" }],
    result = [array1, array2]
        .reduce((a, b) =>
            a.reduce((r, v) =>
                r.concat(b.map(w => Object.assign({}, v, w))), []));

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
0 голосов
/ 28 сентября 2018

Для достижения ожидаемого результата используйте нижеприведенную опцию циклического перебора двух массивов

 var x = [
    {
     "userId": 9
    },
    {
      "userId": 14
     }
    ]

 var y = [{"role": "1", "group": "3"}, {"role": "1", "group": "2"}] 
 let result = []
 
y.forEach((v, i) =>{
  x.forEach((y,i) => result.push({...v, ...y}))
})

console.log(result);

codepen - https://codepen.io/nagasai/pen/pxvzOG?editors=1010

0 голосов
/ 28 сентября 2018

Другое решение, использующее для цикла

let arr1 = [{ "userId": 9 }, { "userId": 14 }]
let arr2 = [{"role": "1","group": "3"}, {"role": "1","group": "2" }] 
let result = [];
for (let group of arr2) {
  for (let user of arr1) [
    result.push(Object.assign({}, group, user))
  ]
}
console.log(JSON.stringify(result))
//output is: 
// [
//  {"role":"1","group":"3","userId":9},
//  {"role":"1","group":"3","userId":14},
//  {"role":"1","group":"2","userId":9},
//  {"role":"1","group":"2","userId":14}
// ]

Пример Stackblitz

0 голосов
/ 28 сентября 2018

Вы можете выполнить итерацию по двум таким массивам и вставить объединенные значения в result:

arr1.forEach(e => {
  arr2.forEach(e2 => {
    result.push(Object.assign({}, e, e2));
  });
});

, что также может быть записано в ОДНОЙ СТРОКЕ:

arr1.forEach(e => arr2.forEach(e2 => result.push(Object.assign({}, e, e2))));

const arr1 = [{
    "userId": 9
  },
  {
    "userId": 14
  }
];

const arr2 = [{
  "role": "1",
  "group": "3"
}, {
  "role": "1",
  "group": "2"
}];

const result = [];

arr1.forEach(e => {
  arr2.forEach(e2 => {
    result.push(Object.assign({}, e, e2));
  });
});

console.log(result);
0 голосов
/ 28 сентября 2018

var a = [{
    "userId": 9
  },
  {
    "userId": 14
  }
]

var b = [{
  "role": "1",
  "group": "3"
}, {
  "role": "1",
  "group": "2"
}]

console.log(
  b.map(z=>a.map(x=>({...x, ...z}))).flat()
)
0 голосов
/ 28 сентября 2018

Вы можете использовать сочетание reduce и map, чтобы свести его к одному массиву объектов.

let data = [{
    "userId": 9
  },
  {
    "userId": 14
  }
]

let metaData = [{
  "role": "1",
  "group": "3"
}, {
  "role": "1",
  "group": "2"
}];

let dataReducer = data.reduce((acc, curr) => {
	let metadataReducer = metaData.map((val) => {
  	   return {
    	      ...curr,
              ...val
           };
         }, []);
  
  return [...acc, ...metadataReducer];
}, []);

console.log(dataReducer)
...