2013-08-01 64 views
0
var _txtString = ":un:-:un:-:deux:-:deux:-:deux:-:trois:-:trois:" ; 
var _array = ["un", "deux", "trois"] ; 
var _items = new Array(); 

for (var t =0; t < _array.length; t++) { 
    found = _txtString.match(new RegExp(':' + _array[t]+ ':', 'g')); 
    _items[t] = parseInt(found.length); 
    //_items.sort(); 
    document.write("<br />" + _items[t] + " " + _array[t]); 
} 

嗨, 當我運行這段代碼,顯示的結果是正確計算:爲什麼sort()函數更改此數組中的數值的值?

2 un 
3 deux 
2 trois 

但是,當我取消排序()線,數是錯誤的:

2 un 
3 deux 
3 trois <= 

我想要的是對數值返回的結果進行排序。我的理解是,sort()函數改變了實際值?!任何線索爲什麼?

謝謝

回答

2

因爲你正在排序,你正在改變數組的順序。所以當你排序的「3」成爲最後一個索引,它寫出來。

_items[t] = parseInt(found.length); //[2,3,2] 
_items.sort(); //[2,2,3] 
document.write("<br />" + _items[t] + " " + _array[t]); //here you are reading the last index which is 3 

如果要按計數進行排序,則需要在計算完所有數據後進行計算。

基本思想:在JavaScript

var _txtString = ":un:-:un:-:deux:-:deux:-:deux:-:trois:-:trois:"; 
var _array = ["un", "deux", "trois"]; 
var _items = new Array(); 

for (var t = 0; t < _array.length; t++) { 
    found = _txtString.match(new RegExp(':' + _array[t] + ':', 'g')); 
    _items.push({ 
     count: found.length, 
     text: _array[t] 
    }); 
} 

_items.sort(function (a, b) { 
    return a.count - b.count; 
}); 

for (var i = 0; i < _items.length; i++) { 
    console.log(_items[i].count, _items[i].text); 
} 
+0

謝謝,只是對你的帖子的評論:在你的第二行啓用排序時,它不是2,2,3,就好像它只是改變順序。它是2,3,3。計數不僅僅是按照不同的順序:它們被改變了。編輯:我發佈此評論時沒有看到您的更新。 – Benj

+0

不,它是'2,2,3'!添加一個console.log行並查看它包含的內容。 '_items [t] = parseInt(found.length); console.log(「before」,_ items.join()); _items.sort(); console.log(「after」,_ items.join());' – epascarello

+0

我喜歡你如何使用push方法將值推入對象。更乾淨。韓國社交協會。 – Benj

2

sort命令不就地排序,這意味着它會產生變異的陣列順序。當發生這種情況時,它只是在我看來像你的代碼與你所期望的不同步。

沒有辦法避免這種情況,除非您複製數組並對副本進行排序,因此原樣保留原始數組。