清姿
IN A GOOD WAY

题目:现在有一个数组,在排序前先复制一份(旧数组),然后对它排序(新数组),求新数组的每个元素在旧数组的位置。

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)

http://www.zhihu.com/question/27525894/answer/36987494?utm_source=weibo&utm_medium=weibo_share&utm_content=share_answer&utm_campaign=share_button

posted on 2015-01-11 19:38  清姿  阅读(114)  评论(0编辑  收藏  举报