【问题标题】:JavaScript sort array not workingJavaScript排序数组不起作用
【发布时间】:2017-11-08 08:44:12
【问题描述】:

我正在尝试对具有 page 属性的对象数组进行排序。这是在 Vue 的计算属性中完成的。

为此,我使用以下函数,它首先构建对象:

 sorted: function(){
     var pages = this.selectedKKS['pages'];
     var list;
     try {
       list = [];
       Object.keys(pages).forEach(function(key){
         console.log(key + " is the key")
         var obj = {};
         obj.title = key;
         obj.page = pages[key]
         list.push(obj)
     });         
     }
     catch(e){
       console.log(e);
     }
     var sorted = list.sort(function(a, b){
       console.log('a.page is ' + a.page + ' and b.page is ' + b.page);  
       return a.page > b.page;  

     });
     return sorted;      
 }   

为了确保我实际上是按照我的意图比较页面,这里是控制台日志:

a.page is 84 and b.page is 28
App.vue?077f:353 a.page is 84 and b.page is 46
App.vue?077f:353 a.page is 28 and b.page is 46
App.vue?077f:353 a.page is 84 and b.page is 35
App.vue?077f:353 a.page is 46 and b.page is 35
App.vue?077f:353 a.page is 28 and b.page is 35
App.vue?077f:353 a.page is 84 and b.page is 14
App.vue?077f:353 a.page is 46 and b.page is 14
App.vue?077f:353 a.page is 35 and b.page is 14
App.vue?077f:353 a.page is 28 and b.page is 14
App.vue?077f:353 a.page is 84 and b.page is 5
App.vue?077f:353 a.page is 46 and b.page is 5
App.vue?077f:353 a.page is 84 and b.page is 8
App.vue?077f:353 a.page is 5 and b.page is 8

我在我的模板中循环这个计算属性,并且由于它的排序不正确,它给了我一个不受欢迎的结果:

            <f7-list>
            <f7-list-item v-for="val in sorted" @click="openpdf(selectedKKS.url, val.page)">                    
                <f7-col><span style="color: black">{{ val.title }}</span></f7-col>                      
                <f7-col>{{ val.page }}</f7-col>                 
            </f7-list-item>
            </f7-list>

关于可能出现什么问题的任何想法?

【问题讨论】:

  • 试试return a.page - b.page;
  • 从我假设的结果来看,page 属性是字符串。所以你正在做字符串比较,结果是有效的。
  • @JaromandaX 当然,我多么愚蠢!如果你写出来,我会接受你的回答。
  • 我确定之前已经完成了:p 不需要再问另一个排序问题了:p

标签: javascript arrays sorting vue.js computed-properties


【解决方案1】:

因为值是字符串,所以它们按词汇(字母)而不是数字顺序排序。

如下改变你的排序函数:

list.sort(function(a, b){
    return Number(a.page) > Number(b.page);  
});

或者更好:

list.sort(function(a, b){
    return Number(a.page) - Number(b.page);  
});

如 cmets 中所述,最好在对象创建期间进行数字转换,以避免每次比较都必须重复执行。

【讨论】:

  • 在创建数组之前大概可以进行数字转换。无需重复转换每个属性。
  • @Sirko 完全同意
【解决方案2】:

在 sorted 函数中尝试使用 '-' 而不是 '>'..

var sorted = list.sort(function(a, b){
   console.log('a.page is ' + a.page + ' and b.page is ' + b.page);  
   return a.page - b.page;  
 });

希望对你有帮助!!

【讨论】:

    【解决方案3】:

    排序的回调函数必须返回一个整数。 lt return 0.

    【讨论】:

      猜你喜欢
      • 2013-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-12
      • 1970-01-01
      • 1970-01-01
      • 2018-09-18
      相关资源
      最近更新 更多