2015-04-24 106 views
4

排序阵列I具有以下结构:由密钥对象

var participant0 = { 
    name : "", 
    nickname : "", 
    number "99999" 
} ; 

var participant1 = { 
    name : "bbb", 
    nickname : "", 
} ; 

var participant2 = { 
    name : "", 
    nickname : "aaa" 
} ; 

var participant3 = { 
    name : "ccc", 
    nickname : "" 
} ; 

,我已经含有结构的实例的数组:

var array = [participant0, participant3, participant1, participant2]; 

我想排序此阵列由字母。首先名称,昵称第二。如果这两个键不存在,我想检查数字键并将此元素放在排序列表的末尾。

预期结果:

var array = [participant2, participant1, participant3, participant0]; 

下面的代码(由 “AAA”, “BBB”, “CCC”, “9999” 已经整理对象)工作正常进行排序姓名或昵称,但我不知道如何在排序列表的末尾提出的项目,如果有数字键:

fav_list.sort(function(x, y) { 
       return (x.participant.name || x.participant.nickname).localeCompare(y.participant.name || y.participant.nickname); 
      }); 
+0

为什么'participant2'的结果应该是前'participant1'?真的有'昵称=“aaa”<昵称=“”'? – hindmost

+1

比较“2”和“10”哪一个最先? –

+1

@最后'昵称=“aaa”<名称=“bbb”'。这些排序规则很奇怪吗?是的,他们是,但这是OP想要的。 – Regent

回答

2

我想这应该这样做,看到评论在代码中:

fav_list.sort(function(x, y) { 
    var xvalue = x.participant.name || x.participant.nickname; 
    var yvalue = y.participant.name || y.participant.nickname; 
    // By name if both have names 
    if (xvalue && yvalue) { 
     return xvalue.localeCompare(yvalue); 
    } 
    // Names always come before numbers 
    if (xvalue) { 
     return -1; 
    } 
    if (yvalue) { 
     return 1 
    } 
    // Otherwise compare numbers 
    return (x.participant.number || 0) - (y.participant.number || 0); 
}); 

您可能想要使用最后一行中的默认数字(零)。

请注意,您显示的数组与代码不完全匹配,因为数组直接使用参与者,但代码期望参与者位于对象的participant属性中。

略有调整阵列和一个方便的方式告诉我们最终什么样的顺序了活生生的例子:

var participant0 = { 
 
    name: "", 
 
    nickname: "", 
 
    number: "99999", 
 
    debug: 0 
 
}; 
 

 
var participant1 = { 
 
    name: "bbb", 
 
    nickname: "", 
 
    debug: 1 
 
}; 
 

 
var participant2 = { 
 
    name: "", 
 
    nickname: "aaa", 
 
    debug: 2 
 
}; 
 

 
var participant3 = { 
 
    name: "ccc", 
 
    nickname: "", 
 
    debug: 3 
 
}; 
 

 
var array = [ 
 
    { 
 
    participant: participant0 
 
    }, 
 
    { 
 
    participant: participant3 
 
    }, 
 
    { 
 
    participant: participant1 
 
    }, 
 
    { 
 
    participant: participant2 
 
    } 
 
]; 
 

 
array.sort(function(x, y) { 
 
    var xvalue = x.participant.name || x.participant.nickname; 
 
    var yvalue = y.participant.name || y.participant.nickname; 
 
    // By name if both have names 
 
    if (xvalue && yvalue) { 
 
    return xvalue.localeCompare(yvalue); 
 
    } 
 
    // Names always come before numbers 
 
    if (xvalue) { 
 
    return -1; 
 
    } 
 
    if (yvalue) { 
 
    return 1 
 
    } 
 
    // Otherwise compare numbers 
 
    return (x.participant.number || 0) - (y.participant.number || 0); 
 
}); 
 
array.forEach(function(entry) { 
 
    snippet.log(entry.participant.debug); 
 
});
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 --> 
 
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>

+1

工作正常!谢谢:) – wawanopoulos

+0

有时候,这段代码会返回:'Uncaught TypeError:xvalue.localCompare不是函数' – wawanopoulos

+0

@wawanopoulos:它应该是'localeCompare',而不是'localCompare'。代码片段是正确的,但顶部的代码示例是错误的,对此感到遗憾 - 现在已经修复。 –

1

一次不要做的一切。

fav_list.sort(function(x,y) { 
    var xname = x.name || x.nickname || "\uffff"+x.number; 
    var yname = y.name || y.nickname || "\uffff"+y.number; 
    return xname.localeCompare(yname); 
}); 

"\uffff"是迫使数去末;)

+0

我会很乐意'localeCompare'和'\ uffff'全局工作。但这仍然非常有创意和简洁。 :-)最后按字母顺序对数字进行排序(在10之前为2),但如果它很重要,则可轻松进行调整。 –

-1

你colud各地尝试的工作。

var numbers = [];  
fav_list.sort(function(x, y) { 
      if(!isNaN(x)){ 
       numbers.push(x); 
      continue; 
      } 
        return (x.participant.name || x.participant.nickname).localeCompare(y.participant.name || y.participant.nickname); 
       }); 
    fav_list.push(numbers); 
0

的代码可以写为:

\uffff is directly interpreted as the desired string, and the whole sequence is realized as a single character

var participant0 = { 
 
    name : "", 
 
    nickname : "", 
 
    number: "99999" 
 
} ; 
 

 
var participant1 = { 
 
    name : "bbb", 
 
    nickname : "" 
 
} ; 
 

 
var participant2 = { 
 
    name : "", 
 
    nickname : "aaa" 
 
} ; 
 

 
var participant3 = { 
 
    name : "ccc", 
 
    nickname : "" 
 
} ; 
 
var array = [participant0, participant3, participant1, participant2]; 
 
console.log(array.sort(function(x,y) { 
 
    var val1 = x.name || x.nickname || "\uffff"+x.number; 
 
    var val2 = y.name || y.nickname || "\uffff"+y.number; 
 
    return xname.localeCompare(val2); 
 
}))
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>

0
function sortObject(object) { // sort Object by key 
    var sorted = {}, 
     key, a = []; 
    for (key in object) { 
     if (object.hasOwnProperty(key)) { 
      a.push(key); 
     } 
    } 
    a.sort(); 
    for (key = 0; key < a.length; key++) { 
     sorted[a[key]] = object[a[key]]; 
    } 
    return sorted; 
} 

function sortArray(arr){//sort array of objects 
    var array=[]; 
    for(var i=0;i<arr.length;i++){ 
     array.push(sortObject(arr[i])); 
    } 
    return array; 
} 

var arr=[{a:'1',c:'2',b:'3'},{c:'1',b:'2',a:'3'}]; 
console.log('===>',sortArray(arr));