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

Sort Multi-dimensional associative arrays in javascript by range

本文关键字:数组 关联 排序 范围 javascript      更新时间:2023-09-26

我正在尝试对从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
}];

我会用什么功能来完成这项工作?如果有任何帮助,我将不胜感激?

@qubyte对如何获取Javascript对象的所有属性值(不知道键)的回答?

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

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

在您的示例中,返回的myObj中的每个值本身就是一个具有属性"title"answers"beats"的对象,并且您希望在整个myObj上搜索那些具有特定beats的对象。

让我们从创建一个函数开始,该函数搜索值的属性,并返回一个具有所需值的数组。

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
    }
]

由于您已经将myObj制作成了一个真实的数组,因此您可以(非常短且非常快):

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

我做了一个函数,它的工作方式我认为你想要它

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