题目:现在有一个数组,在排序前先复制一份(旧数组),然后对它排序(新数组),求新数组的每个元素在旧数组的位置。
var a = [5, 4, 7, 1, 3, 1, 9, 2, 2]//这个数组有重复元素,也可能存在其他类型,如object,null, boolean var oldArray = a.slice(0) var newArray = a.sort() //sort有时需要传入函数
最后求出一个索引集,比如上面的例子就应该返回
[3, 5, 7, 8, 4, 1, 0, 2, 6]
PS:ES5中的map:
map方法的作用不难理解,“映射”,也就是原数组被“映射”成对应新数组。下面这个例子是数值项求平方:
var data = [1, 2, 3, 4]; var arrayOfSquares = data.map(function (item) { return item * item; }); alert(arrayOfSquares); // 1, 4, 9, 16
通常用户会传入比较函数, 或者不传入比较函数,我们需要知道sort方法不传比较函数时,它内部的比较函数的逻辑是什么,于是问题就来了,不是挖掘机
var a = [5, 4, 7, 1, 3, 1, 9, 2, 2] var sortFn = function(x, y) { //假设这是sort方法不传比较函数时,浏览器自带的比较函数 if (x === y) return 0; if ((typeof x === "string") && (typeof y === "string")) { return String(x).localeCompare(y); } x = x + ""; y = y + ""; if (x == y) return 0; else return x < y ? -1 : 1; } var reverseFn = function() {//这是reverse方法,用sort方法实现时的比较函数,这个很容易推断出来 return 1 } var compareFn = /* userFn ? userFn : isReverse ? reverseFn: sortFn */ sortFn var bb = a.map(function(el, index){ return { data: el, index: index } }) var indexes = bb.sort(function(a, b){ return compareFn(a, b) }).map(function(el){ return el.index }) console.log(indexes)