2016-03-03 37 views
-2

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

到目前为止你在做什么? –

+0

为什么你的数组值不是字符串? –

+0

寻求调试帮助的问题(“为什么这个代码不工作?”)必须包含所需的行为,特定的问题或错误以及在问题本身中重现问题所需的最短代码。没有明确问题陈述的问题对其他读者无益。请参阅:[如何创建最小,完整和可验证示例](http://stackoverflow.com/help/mcve)。 –

回答

1

Sorting with map

// 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>');

0

最简单的解决方案。没有映射..

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]; 
0

您可以将数组项映射到包含在排序需要的值对象和然后将其映射回来。 (使用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); 
0

可以通过这两个阵列一起拉上开始。接下来,按他们的顺序排序它们。然后,将每个项目映射到一个字符串。最后加入并打印清单。

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; 
 
    }, {}); 
 
    }); 
 
}

0

您可以直接映射numberArray各指标

ES6

numberArray.map(n=>stringArray[n-1]) 

在获得字符串数组元素 '定期JS'

numberArray.map(function(n){return stringArray[n-1]}) 
0

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; 
     } 
    }