【问题标题】:Getting the order of elements in array without sorting it获取数组中元素的顺序而不对其进行排序
【发布时间】:2014-05-23 12:51:55
【问题描述】:

我希望拥有与排序相同的功能(例如传递一个比较函数),而不是对数组进行排序,而是为每个对象调用一个函数,该函数将特定元素的顺序作为参数。

你可以这样使用它:

var users=[
    {name:"Stephen",age:12},
    {name:"Mike",age:17},
    {name:"Jeffrey",age:32},
    {name:"Anna",age:15}
]

var result=users.getOrder(
     function(userA,userB)
            {return userA.age-userB.age>0;},
     function(user,order)
            {user.num=order;});

/* result=[
    {name:"Stephen",age:12,num:4},
    {name:"Mike",age:17,num:2},
    {name:"Jeffrey",age:32,num:1},
    {name:"Anna",age:15,num:3}
]*/

如果他们是一种使用通常的数组函数来编写它的方法,或者我必须自己编写循环和排序算法,我会很高兴。有什么办法吗?

【问题讨论】:

    标签: javascript arrays sorting


    【解决方案1】:

    一个解决方案是例如: 您可以克隆原始数组并使用标准排序对其进行排序。然后你可以遍历 cloned 并查看 sorted 的索引是他们的名字或年龄匹配的地方。

    for(var j =0; j<b.length;j++){
        for(var k=0;k<a.length;k++){
            if(b[j].name === a[k].name){
                b[j].num = k;
            }
        }
    }
    

    见 fiddle 与bubblesort: http://jsfiddle.net/GeJ6v/

    【讨论】:

    • 好的,唯一的问题是映射是 O(n^2),这不是很好......我猜克隆也有点耗时。顺便说一句,你为什么不在你的小提琴中使用标准排序?
    • 没错,在更大的数据集上它可能会变得有点沉重。 Fir 排序我恰好在确切的时刻有代码在我面前所以我修改了它,它背后并没有真正的更深层次的推理。
    【解决方案2】:

    这是我的解决方案,O(n * sqrt(n))

    Array.prototype.getOrder=function(compareFunction,indexFunction,setFunction) {
        var index={};
        this.forEach(function(user) {
            index[indexFunction(user)]=user;
        });
      
        newUsers= this.slice().sort(compareFunction);
            
        newUsers.forEach(function(user,num) {
            setFunction(index[indexFunction(user)],num);
        });
        return this;
    }    
    

    http://jsfiddle.net/gFLys/

    【讨论】:

      猜你喜欢
      • 2019-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多