2014-09-22 83 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; 
    }); 
}