Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Вычисление елемента в массиве и отбор за заданными условиями (https://javascript.ru/forum/misc/67518-vychislenie-elementa-v-massive-i-otbor-za-zadannymi-usloviyami.html)

TimohaP 21.02.2017 21:27

Вычисление елемента в массиве и отбор за заданными условиями
 
Сразу хочу предупредить, что для того, что я описываю, Array.find() или что-то типа того совсем не подойдут.
А теперь к сути. У меня есть массив:
[
[1,2],
[8,9],
[1,5]
]

(на самом деле в моем случае массив немножко не такой, но суть та же.)
Мне нужно выбрать из массива такой "подмассив", сумма элементов которого дает наибольший результат. При чем нужно возвращать не сумму, а сами числа, из которых она сформирована.
Например:
blablabla( [ [1,60], [58,60] ] ) == [1,60] (ибо 58-60=2 < 1-60=59)

рони 21.02.2017 21:40

TimohaP,
function a(d) {
    return d.reduce(function(b, c) {
        return Math.abs(b[0] - b[1]) > Math.abs(c[0] - c[1]) ? b : c
    })
};

alert(a([ [1,60], [58,60] ]))
alert(a([ [1,2],[8,9],[1,5]]))

рони 21.02.2017 21:44

:write:
сума сумма!!! а на самом деле модуль разницы элементов

TimohaP 21.02.2017 22:03

рони,
окей, модуль разницы, но на самом деле задача несколько посложнее будет. я просто думал, что это аналогично, но нет.
в массиве хранятся значения координат x0, y0, x1, y1, и среди них нужно выбрать те, которые дадут наибольшую длину.
формула длины: Math.sqrt( Math.pow(x1-x0, 2) + Math.pow(y1-y0, 2) )
вот к примеру:
longest ( [
[ 0,0,20,20 ],
[ 0,0,10,10 ]
] ) = [0,0,20,20]

TimohaP 21.02.2017 22:26

окей, я уже разобрался. может не самое адекватное решение, но оно работает
var array =  [
[ 0,0,20,20 ],
[ 0,0,10,10 ]
];
function longest(array){
var lengths = array.map( function(i){ return Math.sqrt( Math.pow(i[2]-i[0], 2) + Math.pow(i[3]-i[1], 2) ) } );
return array[ lengths.indexOf( Math.max.apply(null, lengths) ) ];
}
alert( longest(array) );

рони 21.02.2017 22:44

TimohaP,
function g(x0, y0, x1, y1)
{
  return Math.sqrt( Math.pow(x1-x0, 2) + Math.pow(y1-y0, 2) )
}


function a(d) {
    return d.reduce(function(b, c) {
        return g.apply(null,b) > g.apply(null,c) ? b : c
    })
};
var array =  [
[ 0,0,20,20 ],
[ 0,0,10,10 ]
];

alert(a(array))


Часовой пояс GMT +3, время: 23:37.