2015-12-21 19 views
5

Her bir sayının 'ağırlığına' dayalı olarak bir sayı dizisini sıralamak için bir işlev oluşturmalıyım - 'weight', birlikte eklenen sayıların rakamlarıdır (99'un ağırlığı 18 olur. 100 ağırlığı 1, vb vs olacaktır. Bu, "100 54 32 62" dizesinin "100 32 62 54" değerini döndüreceği anlamına gelir.Bir dizi nasıl sıralandığını temel alarak nasıl sıralanır? (Javascript)

ben kullanarak gayet güzel bu sayıların ağırlıkları dizisi alabilirsiniz: add sadece jenerik ekleme fonksiyonudur

function orderWeight(str) { 
    var arr = str.split(" "); 
    var sortArr = []; 
    arr.forEach(t => sortArr.push(t.split("").map(s => parseInt(s, 10)).reduce(add, 0))); 
} 

. Yukarıdaki örnek için sortArr, [1, 9, 5, 8] olacaktır.

arr dizgideki orijinal sayıların dizisini, sortArr numaralı numaraların yeni dizilerinin nasıl sıralanacağına bağlı olarak sıralamak için en iyi yolu nedir?

Teşekkürler!

cevap

4

Bu hile yapmak gerekir:

var x = '100 54 32 62'; 

function orderWeight(str) { 
    return str.split(' ').sort(function(a, b) { 
    return (a.split('').reduce(function(p, c) { return +p + +c; })) > (b.split('').reduce(function(p, c) { return +p + +c; })); 
    }).join(' '); 
} 

var result = orderWeight(x); 

Çıktı:

100 32 62 54 

GÜNCELLEME:

Sterling önerdiği Başına

, burada lambda biçiminde yazılmış aynı fonksiyon.

var x = '100 54 32 62'; 

function orderWeight(str) { 
    return str.split(' ').sort((a, b) => a.split('').reduce((p, c) => +p + +c) > b.split('').reduce((p, c) => +p + +c)).join(' '); 
} 

var result = orderWeight(x); 

Not: Bu benim ilk defa lambda sözdizimini kullanarak Javascript yazıyor. Önermek için Sterling'e teşekkürler.

+0

Bir çekicilik gibi çalıştı! Teşekkürler. Özyinelemeli uygulama – joh04667

+0

OP kullanarak –

+0

@Sterling gibi ES6 sözdizimini göstermek için bunu düzenlemelisiniz - Ne demek istediğimi bilmiyorum, lütfen yanıtı güncelleştirebileyim ... teşekkürler – Will

0

sorting with map ile bir çözüm.

function sort(string) { 
 
    var array = string.split(' '), 
 
     mapped = array.map(function (a, i) { 
 
      return { index: i, value: +a.split('').reduce(function (a, b) { return +a + +b; }) }; 
 
     }); 
 
    return mapped.sort(function (a, b) { 
 
     return a.value - b.value; 
 
    }).map(function (a) { 
 
     return array[a.index]; 
 
    }).join(' '); 
 
} 
 

 
document.write('<pre>' + JSON.stringify(sort('100 54 32 62'), 0, 4) + '</pre>');

I dizinler (0..n-1), bir dizi ve belirli bir dizin için ağırlıkları karşılaştıran bir karşılaştırma işlevi geçirilerek (ağırlıkları dizi göre o sıralamak
-1

değerleri). Ardından, her öğenin nerede olması gerektiğini gösteren bir dizi dizininiz olacaktır (örneğinizde dizin dizisi [0, 2, 3, 1] olur, bu da arr [0] ilkinin daha sonra arr [2] olması anlamına gelir. ], vb. Şimdi dizin dizisini kullanarak sıralanmış diziyi oluşturabilirsiniz, örneğin [arr [0], arr [2], arr [3], arr [1]]. Özetlemek için: Giriş dizisini al , ağırlıklar dizisini hesaplayın, dizin dizisini yaratın ..n-1, ağırlıkları dizisine göre sıralayın ve sonlandırılmış dizilim dizisini temel alarak çıktı dizisini oluşturun:

İlgili konular