按范围对javascript中的多维关联数组进行排序

时间:2014-09-22 16:37:42

标签: javascript arrays

我正在尝试对从我的API返回的多维数组进行排序,以允许人们根据节拍选择范围。

说实话,我确实坚持了我的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
}];

我会用什么功能来表达对此的任何帮助?

3 个答案:

答案 0 :(得分:1)

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

告诉我们如何枚举返回的Object的所有值。

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

在您的示例中,返回的myObj中的每个值本身都是一个属性为“title”和“beats”的对象,并且您希望在整个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
    }
]

答案 1 :(得分:1)

由于你已经使myObj成为一个真正的数组,你可以做到(非常短而且非常快):

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

答案 2 :(得分:0)

我制作了一个按我认为你想要的方式运作的功能

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