2016-08-18 65 views
1

我正在嘗試創建一個排序函數,它在動態(以不同深度)動態給出鍵時對對象的嵌套數組進行排序。使用動態鍵排序對象的嵌套數組

sortByKey(array, key){ 
    var splitKey = key.split("."); 
    if(splitKey.length = 2){ 
     return array.sort(function(a, b) { 
     var x = a[splitKey[0]][splitKey[1]]; var y = b[splitKey[0]][splitKey[1]]; 
     return ((x < y) ? -1 : ((x > y) ? 1 : 0)); 
     }); 
    } else { 
     return array.sort(function(a, b) { 
     var x = a[key]; var y = b[key]; 
     return ((x < y) ? -1 : ((x > y) ? 1 : 0)); 
     }); 
    } 
    } 

我想擺脫if - else和使用for循環來代替。目標是該函數與'name','name.first'和'name.first.another'(作爲示例)一起工作。有沒有辦法做到這一點動態?

換句話說,我想用不同的數組使用相同的函數。因此,對於一個數組,我想對sortByKey(array1,'name')和另一個sortByKey(array2,'location.address')進行排序,也可能使用第三個sortByKey(array3,'location.address.postalcode')或其他像那樣。

+0

'如果(splitKey.length = 2)'是不可能做你的想法。 – 2016-08-18 12:44:35

+1

你能提供你想要完成什麼樣的例子嗎? – Radioreve

回答

0

提取屬性提取功能

function prop(key) { 
    var keys = key.split('.'); 

    return keys.reduce.bind(keys, function(obj, name) { 
    return obj[name] 
    }) 
} 

,並用它來很好提取值:)

sortByKey(array, key){ 
    var getKey = prop(key); 

    return array.sort(function(a, b){ 
     var x = getKey(a); var y = getKey(b); 
     return ((x < y) ? -1 : ((x > y) ? 1 : 0)); 
    }) 
    } 
+0

像一個迷人的作品,謝謝! – Steinroe

0

我想你的意思是這樣的:

function sortByKey(array, key){ 
    var splitKey = key.split("."); 

    return array.sort(function(a, b) { 
     var ta = a; 
     var tb = b; 
     for (var i=0; i<splitKey.length; i++) { 
      ta = ta[splitKey[i]]; 
     }; 
     /// return ((a < b) ? -1 : ((a > b) ? 1 : 0)); // Too complex ;-) 
     return a - b; 

    }); 

}; 
0

你的問題是一個誤用的任務,它應該是一個比較。

if (splitKey.length === 2) { 
//     ^^^ 

較短的方法可以使用Array#reduce

function sortByKey(array, key) { 
 
    var getValue = function (o, k) { return o[k]; }, 
 
     keys = key.split("."); 
 

 
    return array.sort(function (a, b) { 
 
     return keys.reduce(getValue, a) - keys.reduce(getValue, b); 
 
    }); 
 
} 
 

 
var array = [{ a: 5, b: { c: 2 } }, { a: 7, b: { c: 1 } }, { a: 1, b: { c: 3 } }]; 
 

 

 

 
sortByKey(array, 'a'); 
 
console.log(array); 
 
sortByKey(array, 'b.c'); 
 
console.log(array);

ES6

function sortByKey(array, key) { 
 
    var getValue = (o, k) => o[k], 
 
     keys = key.split("."); 
 

 
    return array.sort((a, b) => keys.reduce(getValue, a) - keys.reduce(getValue, b)); 
 
} 
 

 
var array = [{ a: 5, b: { c: 2 } }, { a: 7, b: { c: 1 } }, { a: 1, b: { c: 3 } }]; 
 

 
sortByKey(array, 'a'); 
 
console.log(array); 
 
sortByKey(array, 'b.c'); 
 
console.log(array);