我有兩個(2)陣列:不同的排序
var stringArray = [Tom, Michael, Bob, Thomas];
var numberArray = [2, 3, 1, 4]
我需要爲排序字符串數組:
[Bob, Tom, Michael, Thomas]
我怎樣才能做到這一點?
等。
Bob = 1 in number array
Tom = 2 in number arra
Michael = 3 ....
我有兩個(2)陣列:不同的排序
var stringArray = [Tom, Michael, Bob, Thomas];
var numberArray = [2, 3, 1, 4]
我需要爲排序字符串數組:
[Bob, Tom, Michael, Thomas]
我怎樣才能做到這一點?
等。
Bob = 1 in number array
Tom = 2 in number arra
Michael = 3 ....
// the array to be sorted
var stringArray = ['Tom', 'Michael', 'Bob', 'Thomas'];
var numberArray = [2, 3, 1, 4];
// temporary array holds objects with position and sort-value
var mapped = stringArray.map(function (el, i) {
return { index: i, value: numberArray[i] };
})
// sorting the mapped array containing the reduced values
mapped.sort(function (a, b) {
return a.value - b.value;
});
// container for the resulting order
var result = mapped.map(function (el) {
return stringArray[el.index];
});
document.write('<pre>' + JSON.stringify(result, 0, 4) + '</pre>');
最簡單的解決方案。沒有映射..
var numberArray = [2, 3, 1, 4];
var stringArray = ["Tom", "Michael", "Bob", "Thomas"];
var sorted = new Array();
for(var i = 0; i < numberArray.length; i++) {
var order = numberArray[i] -1;
var val = stringArray[order];
sorted.push(val);
}
console.log(sorted);
你的陣列應該是這樣的......
var stringArray = ["Tom", "Michael", "Bob", "Thomas"];
,而不是這個
var stringArray = [Tom, Michael, Bob, Thomas];
您可以將數組項映射到包含在排序需要的值對象和然後將其映射回來。 (使用ES6語法):
var stringArray = ["Tom", "Michael", "Bob", "Thomas"];
var numberArray = [2, 3, 1, 4]
var sorted = stringArray
.map((item, index) => ({ value: item, order: numberArray[index] }))
.sort((a, b) => a.order > b.order)
.map(item => item.value);
console.log(sorted);
ES5類比:
var sorted = stringArray.map(function(item, index) {
return { value: item, order: numberArray[index] };
}).sort(function(a, b) {
return a.order > b.order;
}).map(function(item) {
return item.value;
});
console.log(sorted);
可以通過這兩個陣列一起拉上開始。接下來,按他們的順序排序它們。然後,將每個項目映射到一個字符串。最後加入並打印清單。
Bob = 1 in number array
Tom = 2 in number array
Michael = 3 in number array
Thomas = 4 in number array
var stringArray = ['Tom', 'Michael', 'Bob', 'Thomas'];
var numberArray = [2, 3, 1, 4];
document.body.innerHTML = zip([stringArray, numberArray]).sort(function(a, b) {
return a[1] - b[1];
}).map(function(item) {
return item[0] + ' = ' + item[1] + ' in number array';
}).join('<br />');
function zip(arrays) {
return arrays[0].map(function(_, i) {
return arrays.map(function(array) {
return array[i];
})
});
}
您可以創建自己的zip()
功能,以減少值的對象。
var stringArray = ['Tom', 'Michael', 'Bob', 'Thomas'];
var numberArray = [2, 3, 1, 4];
document.body.innerHTML = zip([stringArray, numberArray], ['name', 'order']).sort(function(a, b) {
return a.order - b.order;
}).map(function(item) {
return item.name;
}).join(', ');
function zip(arrays, fields) {
return arrays[0].map(function(_, i) {
return arrays.map(function(array) {
return array[i];
}).reduce(function(obj, value, index) {
obj[fields[index]] = value;
return obj;
}, {});
});
}
您可以直接映射numberArray各指標
ES6
numberArray.map(n=>stringArray[n-1])
在獲得字符串數組元素 '定期JS'
numberArray.map(function(n){return stringArray[n-1]})
numberArray []甲建議是秩(+1)。這個例子創建了另一個數組I [],它將秩+1轉換成有序索引(0到n-1),在O(n)時間重新排序stringArray []和I []最終排序位置)。C示例,應該可以轉換爲javascript:
char * stringArray[] = {"Tom", "Michael", "Bob", "Thomas"};
int numberArray[] = {2, 3, 1, 4};
int I[4]; // change 4 to array size
int i, j, k;
char * tS; // temp for stringArray element
// convert rank+1 to sorted index I[]
for(i = 0; i < 4; i++) // change 4 to array size
I[numberArray[i]-1] = i;
// reorder stringArray in place
for(i = 0; i < 4; i++){ // change 4 to array size
if(i != I[i]){
tS = stringArray[i];
k = i;
while(i != (j = I[k])){
stringArray[k] = stringArray[j];
I[k] = k;
k = j;
}
stringArray[k] = tS;
I[k] = k;
}
}
到目前爲止你在做什麼? –
爲什麼你的數組值不是字符串? –
尋求調試幫助的問題(「爲什麼這個代碼不工作?」)必須包含所需的行爲,特定的問題或錯誤以及在問題本身中重現問題所需的最短代碼。沒有明確問題陳述的問題對其他讀者無益。請參閱:[如何創建最小,完整和可驗證示例](http://stackoverflow.com/help/mcve)。 –