2017-08-17 50 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; 
}