Как создать все возможные комбинации между двумя массивами объектов?

#javascript #arrays #reactjs

#javascript #массивы #reactjs

Вопрос:

У меня есть два массива объектов, то есть источник и место назначения. Я пытаюсь найти все возможные комбинации, которые можно создать из двух массивов, чтобы создать окончательный массив. Пример:

 origin = [
 {
   id: 1,
   regionName: "Africa North"
 },
 {
   id: 2,
   regionName: "Africa West"
 }
];

destination: [
 { 
   id: 5,
   regionName: "Gulf"
 },
 {
   id: 8,
   regionName: "Middle East"
 },
 {
   id: 9,
   regionName: "Central America"
 }
]
 

Конечный массив должен дать мне,

  finalArray = [
   {
    originRegion: "Africa North",
    destinationRegion: "Gulf",
    ts: "1606370160"
   },
   {
    originRegion: "Africa North",
    destinationRegion: "Middle East",
    ts: "1606370160"
   },
   {
    originRegion: "Africa North",
    destinationRegion: "Central America",
    ts: "1606370160"
   },
   {
    originRegion: "Africa West",
    destinationRegion: "Gulf",
    ts: "1606370160"
   },
   {
    originRegion: "Africa West",
    destinationRegion: "Middle East",
    ts: "1606370160"
   },
   {
    originRegion: "Africa West",
    destinationRegion: "Central America",
    ts: "1606370160"
   },
 ]
 

Я попытался найти некоторые перестановки и комбинации для двух массивов объектов, но не нашел подходящего ответа.
Это то, что я пытаюсь:

 useEffect(() => {
        var origin = [
            {
                id: 1,
                regionName: "Africa North"
            },
            {
                id: 2,
                regionName: "Africa West"
            }
        ];

        var destination = [
            {
                id: 5,
                regionName: "Gulf"
            },
            {
                id: 8,
                regionName: "Middle East"
            },
            {
                id: 9,
                regionName: "Central America"
            }
        ];

        var finalArray = []

        for (var i = 0; i < origin.length; i  ) {
            for (var j = 0; j < destination.length; j  ) {
                finalArray.push(origin[i].regionName   destination[j].regionName)
            }
        }

        console.log("finalArray", finalArray)
    }, []);
 

Заранее благодарю.

Комментарии:

1. Вы пытались изменить это решение в соответствии с вашими требованиями?

2. Да, я пытаюсь изменить это, пока мы говорим. Я делюсь тем, что я пытаюсь.

3. не уверен, что именно такое useEffect и ts, но вы могли бы изменить свои циклы for, чтобы получить желаемый результат: for (var i = 0; i < origin.length; i ) { for (var j = 0; j < назначение. длина; j ) { finalArray.push({originRegion: origin[i].RegionName, destinationRegion: destination[j].RegionName, ts: Date.now()}); } }

4. @RahulR. Большое спасибо за спасение дня. Я пишу код на React.js и крючки, поэтому я использовал useEffect, а ts — это просто временная метка. Еще раз спасибо.

Ответ №1:

Похоже, у вас есть часть с двойным циклом, но объект, который вы помещаете в свой массив, не соответствует вашим ожиданиям. Вы выполняете простую конкатенацию строк.

 origin[i].regionName   destination[j].regionName
 

Вот то, что я считаю более «реактивным» способом перебора данных и возврата результирующего массива. Уменьшите origin массив в новый массив, сопоставив объединенный объект с destination массивом.

 origin.reduce(
  (result, origin) => [
    ...result,
    ...destination.map((destination) => ({
      originreagion: origin.regionName,
      destinationRegion: destination.regionName,
      ts: "1606370160" // <-- set your real timestamp here
    }))
  ],
  []
);
 
 const origin = [
  {
    id: 1,
    regionName: "Africa North"
  },
  {
    id: 2,
    regionName: "Africa West"
  }
];

const destination = [
  {
    id: 5,
    regionName: "Gulf"
  },
  {
    id: 8,
    regionName: "Middle East"
  },
  {
    id: 9,
    regionName: "Central America"
  }
];

const result = origin.reduce(
  (result, origin) => [
    ...result,
    ...destination.map((destination) => ({
      originreagion: origin.regionName,
      destinationRegion: destination.regionName,
      ts: "1606370160"
    }))
  ],
  []
);

console.log(result)