Функция для вычисления всех комбинаций

#javascript #for-loop

Вопрос:

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

У меня есть массив массивов. Каждый массив имеет несколько объектов(не всегда одинаковых), и каждый объект имеет name probability свойство «и».

 [
[{name: AAA, probability: .7}, {name:BBB, probability: .6}, {name: CCC, probability: .1}],
[{name: AAA, probability: .8}, {name: CCC, probability: .7}, {name: DDD, probability: .4}],
[{name: AAA, probability: .8}, {name: BBB, probability: .5}, {name: DDD, probability: .8}]
]
 

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

Другими словами, я хочу найти максимальное значение probability from array 1 , умноженное на probability from array 2 умноженное на probability from array 3 , без каких-либо повторений name .

Я не уверен, есть ли умный математический трюк, чтобы решить это, не пробуя все комбинации (пожалуйста, дайте мне знать, если есть), но сейчас я просто хочу найти решение с помощью грубой силы.

Я мог бы решить эту проблему, вложив цикл for для каждого массива в моем наборе данных, но это стало бы излишне большим.

 const selection=[]
for(array of data){
 for(object of array){
  if(selction.includes(object.name)){
    selction.push(object.name)
    for(object   1 of array){
      ...
    }
   }
  }
}
 

В основном я хочу избежать написания цикла for для каждого отдельного массива в моем наборе данных.

Если проблема все еще сбивает с толку, я могу добавить больше деталей.

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

1. «Я хочу найти максимальную вероятность» — вы хотите найти предмет с наибольшим probability свойством?

2. итак, ожидаемым результатом вашего примера будет 0.7 * 0.7 * 0.8 ?

3. Да, похоже, что это правильно. В основном мне нужно проверить все комбинации, не повторяя имени.

Ответ №1:

Вы можете сгладить массив (с Array.flat помощью ), map через каждый элемент, чтобы извлечь probability свойства, затем использовать синтаксис распространения и Math.max получить самый большой элемент в результирующем массиве:

 const arr = [
  [{name: 'AAA', probability: .7}, {name:'BBB', probability: .6}, {name: 'CCC', probability: .1}],
  [{name: 'AAA', probability: .8}, {name: 'CCC', probability: .7}, {name: 'DDD', probability: .4}],
  [{name: 'AAA', probability: .8}, {name:'BBB', probability: .5}, {name: 'DDD', probability: .8}]
]

const highestProbability = Math.max(...arr.flat().map(e => e.probability))

console.log(highestProbability) 

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

1. Разве это не дало бы мне самую высокую вероятность каждого массива?

2. @tdammon Это дало бы самый высокий из всех массивов, так как исходный массив был сплющен.

3. Я отредактировал свой пост для ясности. Я ищу максимальное значение произведения умножения одной вероятности из каждого массива.

4. Это не сработает. Автор заявил, что вы не можете использовать свойство с таким же именем.