#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. Это не сработает. Автор заявил, что вы не можете использовать свойство с таким же именем.