2017-08-17 86 views
3

给定一个数组,它将始终包含twothree值。我需要确定最大值的索引并添加属性,让它可以说main。然后根据设置的顺序将left设置为第一小值并将right设置为第二小值。 (小心array6按数值和顺序确定数组

总是有一个main

很容易确定,如最大的价值:

var array1 = [0.25, 0.75];  // desired result: ['left', 'main'] 
 
var array2 = [0.75, 0.25];  // desired result: ['main', 'right'] 
 
var array3 = [0.25, 0.50, 0.25]; // desired result: ['left', 'main', 'right'] 
 
var array4 = [0.50, 0.25, 0.25]; // desired result: ['main', 'left', 'right'] 
 
var array5 = [0.25, 0.25, 0.50]; // desired result: ['left', 'right', 'main'] 
 
var array6 = [0.40, 0.10, 0.50]; // desired result: ['left', 'right', 'main'] 
 
var array7 = [0.50, 0.50];  // desired result: ['left', 'main'] 
 

 

 
index1 = array1.indexOf(Math.max.apply(Math, array1)); 
 
index2 = array2.indexOf(Math.max.apply(Math, array2)); 
 
index3 = array3.indexOf(Math.max.apply(Math, array3)); 
 
index4 = array4.indexOf(Math.max.apply(Math, array4)); 
 
index5 = array5.indexOf(Math.max.apply(Math, array5)); 
 
index6 = array6.indexOf(Math.max.apply(Math, array6)); 
 

 
console.log(
 
    'index1: ', index1, 
 
    'index2: ', index2, 
 
    'index3: ', index3, 
 
    'index4: ', index4, 
 
    'index5: ', index5, 
 
    'index6: ', index6 
 
);

但我怎么能达到预期结果的不休息,现在100,如果用别的来确定?

更新 数组值的总和总是为1

+0

我不认为它在很短的一行是可能的(或读取)。相反,我会写一个函数'function(probabilities){return ['left','right','main']; }'并使用if/else块。当功能正在工作时,您可以尝试优化和组合类似的代码块。 – user3151902

+0

'[0.50,0.25,0.75]'应该输出什么?它是“[左,右,主]”吗?但'0.50'大于'0.25',根据你的问题,它会是'[right,left,main]' –

+0

oooh @KoushikChatterjee好问题!我会更新这个问题,因为我在那里提到它是错误的!它应该是'[''左','右','主']' – caramba

回答

1

在这里,我写道,将解决你的目的,以最小if...else

var array1 = [0.25, 0.75];  // desired result: ['left', 'main'] 
 
var array2 = [0.75, 0.25];  // desired result: ['main', 'right'] 
 
var array3 = [0.25, 0.50, 0.25]; // desired result: ['left', 'main', 'right'] 
 
var array4 = [0.50, 0.25, 0.25]; // desired result: ['main', 'left', 'right'] 
 
var array5 = [0.25, 0.25, 0.50]; // desired result: ['left', 'right', 'main'] 
 
var array6 = [0.40, 0.10, 0.50]; // desired result: ['left', 'right', 'main'] 
 
var array7 = [0.50, 0.50];  // desired result: ['left', 'main'] 
 

 
function transformArr(numArr) { 
 
    var res = ['left', 'right']; 
 
    maxIdx = numArr.lastIndexOf(Math.max.apply(Math, numArr)); 
 
    res.splice(maxIdx, numArr.length === 2, 'main') 
 
    return res; 
 
} 
 

 
console.log('Result 1', transformArr(array1)); 
 
console.log('Result 2', transformArr(array2)); 
 
console.log('Result 3', transformArr(array3)); 
 
console.log('Result 4', transformArr(array4)); 
 
console.log('Result 5', transformArr(array5)); 
 
console.log('Result 6', transformArr(array6)); 
 
console.log('Result 7', transformArr(array7));

这个代码写在考虑到阵列将包含2或3数的函数。

评论如果有什么不明确的。

+0

@caramba我编辑了我的答案,删除了'if' else。请检查。 –

1

如果数组的长度为2,您可以在右边第一个最大值的索引处拼接值main并删除一个值。

function x(array) { 
 

 
    function getMax(r, a, i, aa) { 
 
     return a > aa[r] ? i : r; 
 
    } 
 

 
    var r = ['left', 'right']; 
 
    r.splice(array.reduceRight(getMax, array.length - 1), array.length === 2, 'main'); 
 
    return r; 
 
} 
 

 
console.log(x([0.25, 0.75]));  // ['left', 'main'] 
 
console.log(x([0.75, 0.25]));  // ['main', 'right'] 
 
console.log(x([0.25, 0.50, 0.25])); // ['left', 'main', 'right'] 
 
console.log(x([0.50, 0.25, 0.25])); // ['main', 'left', 'right'] 
 
console.log(x([0.25, 0.25, 0.50])); // ['left', 'right', 'main'] 
 
console.log(x([0.40, 0.10, 0.50])); // ['left', 'right', 'main'] 
 
console.log(x([0.50, 0.50]));  // ['left', 'main']
.as-console-wrapper { max-height: 100% !important; top: 0; }

0

我5毛钱:

function transformArr(arr){ 
    let indexes = arr.map((_, i) => i); 
    indexes.sort((i1, i2) => arr[i2] - arr[i1]); 

    let mainI = indexes[0]; 
    indexes = indexes.map(x => { 
    return {index: x, atLeft: x < mainI, value: arr[x]}; 
    }); 

    let res = {"main": indexes[0].value}; 
    // let names = ['left', 'inner left', 'inner right', 'right']; 
    let names = ['left', 'right']; 
    for(let i = 1; i < indexes.length; i++){ 
    let val = indexes[i]; 
    let name = val.atLeft ? names.shift() : names.pop(); 
    res[name] = val.value; 
    } 
    return res; 
}