Как объединить несколько массивов jsons в один массив пересечь с подмассива в JavaScript?

1

У меня есть два 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"}
]
  • 0
    У вас есть JSON или у вас есть объекты JavaScript? Если это не JSON (прочитайте описание тега json ), не могли бы вы удалить тег и слово из вашего вопроса?
Теги:
arrays
merge
let

6 ответов

0
Лучший ответ

Вы можете выполнить итерацию по двум таким массивам и вставить объединенные значения в 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);
4

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
    Это приятно. Жаль, что flat() еще не поддерживается в Node или Edge.
1

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

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

1

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

 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

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

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

Вы можете использовать сочетание 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)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню