我有两个(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)。 –