2014-09-22 55 views
0

我想對從我的API返回的多維數組進行排序,以允許用戶根據節拍選擇一個範圍。按範圍對JavaScript中的多維關聯數組排序

說實話我真的堅持我的api返回。

var myObj = [{ 
    title: 'title one', 
    beats: 1 
}, { 
    title: 'title two', 
    beats: 2 
}, { 
    title: 'title three', 
    beats: 3 
}, { 
    title: 'title four', 
    beats: 4 
}, { 
    title: 'title five', 
    beats: 5 
}, { 
    title: 'title six', 
    beats: 6 
}, { 
    title: 'title seven', 
    beats: 7 
}, { 
    title: 'title eight', 
    beats: 8 
}, { 
    title: 'title nine', 
    beats: 9 
}, { 
    title: 'title ten', 
    beats: 10 
}]; 

現在我試圖讓用戶選擇基於節拍的範圍。

所以,如果他們選擇1-4會返回。

var myObj = [{ 
    title: 'title one', 
    beats: 1 
}, { 
    title: 'title two', 
    beats: 2 
}, { 
    title: 'title three', 
    beats: 3 
}]; 

和8-10將返回等等...

var myObj = [{ 
    title: 'title eight', 
    beats: 8 
}, { 
    title: 'title nine', 
    beats: 9 
}, { 
    title: 'title ten', 
    beats: 10 
}]; 

我會用什麼功能來做到這一點希望得到任何幫助?

+1

您的myObj不是一個數組,它是一個包含數字的對象作爲屬性。是否有可能讓myObj成爲真正的數組? – 2014-09-22 16:49:15

+0

嗨馬丁我更新了問題 – user1503606 2014-09-22 17:07:46

+0

嗨user1503606。 **保羅**的回答非常好。爲了完成任務,我發佈了一個數組用法的答案。 – 2014-09-22 19:00:39

回答

1

@ qubyte的answerHow to get all properties values of a Javascript Object (without knowing the keys)?

告訴我們如何枚舉返回的對象的所有值。

for (var key in obj) { 
    if (obj.hasOwnProperty(key)) { 
     var val = obj[key]; 
     // use val 
    } 
} 

在你的榜樣,在返回MyObj中的每個值本身屬性「頭銜」和「節奏」的對象,你要尋找那些具有特定節拍整個MyObj中。

讓我們從一個函數開始,搜索這些值的屬性並返回一個具有所需值的數組。

function searchByProperty(obj, property, low, high){ 
    var found = []; 
    var val, prop; 
    for (var key in obj) { 
    if (obj.hasOwnProperty(key)) { 
     val = obj[key]; 
     prop = val[property]; 
     if((prop>=low) && (prop<=high)) found.push(val); 
    } 
    return found; 
} 

現在我們可以用這樣的:

searchByProperty(myObj, 'beats', 1, 4) 

將返回:

[ 
    { 
     title: 'title one', 
     beats: 1 
    }, 
    { 
     title: 'title two', 
     beats: 2 
    }, 
    { 
     title: 'title three', 
     beats: 3 
    }, 
    { 
     title: 'title four', 
     beats: 4 
    } 
] 
+0

非常感謝你非常保羅;) – user1503606 2014-09-22 17:12:59

+0

這實際上是你的問題的第一個版本的答案。如果myObj是一個數組而不是Object,那麼'searchByProprerty'中的循環可以改爲'for(var i = 0,l = myArray.length; i Paul 2014-09-22 17:14:49

0

我做這工作我覺得這樣一個功能,你希望它

function getBeatsObj(allBeatsObj,rangeStart,rangeEnd) { 
    var returnObj = {}; 
    for(var i = rangeStart; i <= rangeEnd; i++) { 
     returnObj[i - 1] = allBeatsObj[i - 1]; 
    } 
    return returnObj; 
} 
+0

如果返回的Object的鍵與值的beats屬性之間的關係只是一個幸運的巧合,那麼這將不起作用。 – Paul 2014-09-22 16:53:36

+0

Hi道歉我更新了問題 – user1503606 2014-09-22 17:05:36

1

由於您MyObj中真正的數組,你可以做(​​非常短,非常快):

function getBeatsArray(myArray, low, high) { 
    return myArray.filter(function(b) { 
     return b.beats <= high && b.beats >=low; 
    }); 
}