0

给定这样的数据

var people = [ 
{ 'myKey': 'A', 'status': 0, score: 1.5 },
{ 'myKey': 'C', 'status': 1, score: 2.0 },
{ 'myKey': 'D', 'status': 0, score: 0.2 },
{ 'myKey': 'E', 'status': 1, score: 1.0 },
{ 'myKey': 'F', 'status': 0, score: 0.4 },
{ 'myKey': 'G', 'status': 1, score: 3.0 },
];

如何获得所有'status':1物品

var people2= [ 
{ 'myKey': 'C', 'status': 1, score: 2.0 },
{ 'myKey': 'E', 'status': 1, score: 1.0 },
{ 'myKey': 'G', 'status': 1, score: 3.0 },
];

编辑: 我的最终目标是'status':1按升序获得 n=2 项,例如:

var people3= [ 
{ 'myKey': 'E', 'status': 1, score: 1.0 },
{ 'myKey': 'C', 'status': 1, score: 2.0 },
{ 'myKey': 'G', 'status': 1, score: 3.0 },
]; 

var people我的方法是从所有项目中'status':1获取一个函数people2(这是我在这里询问的代码),一个 fnpeople2按升序排序(people3),然后一个 fn 选择第一个项目'myKey':的值。n=2所以我得到

var people4 = [ 'E', 'C' ];
4

4 回答 4

4
function getMyKeys(top) {    
   var result = people.filter(function (item) {
          return item["status"] === 1; //only status=1
       })
       .sort(function (a, b) {
          return a["score"] - b["score"]; //sort 
       })
       .slice(0, top) //top n
       .map(function (item) {
          return item["myKey"]; //return "myKey" property only, if needed.
       });
   }

小提琴演示

于 2013-04-22T08:51:41.747 回答
1

使用新filter方法有条件地减少数组中的项目集。一旦减少通过将比较函数传递给项目对项目进行排序Array.sort()

var people = [ 
{ 'myKey': 'A', 'status': 0, score: 1.5 },
{ 'myKey': 'C', 'status': 1, score: 2.0 },
{ 'myKey': 'D', 'status': 0, score: 0.2 },
{ 'myKey': 'E', 'status': 1, score: 1.0 },
{ 'myKey': 'F', 'status': 0, score: 0.4 },
{ 'myKey': 'G', 'status': 1, score: 3.0 },
];

    var selected = people.filter(function(e){
        return e.status == 1;
    });

    selected.sort(function(a,b){
       if(a.score < b.score){return -1;}
       if(a.score > b.score){ return 1;}
       return 0;
    });

如果您必须支持较旧的浏览器,您可能需要将该.filter方法构建到浏览器中。MDN 上的此文档包含.filter可以添加到浏览器的本机实现。

工作示例 http://jsfiddle.net/5zt3A/

于 2013-04-22T08:49:25.970 回答
1

您必须按状态过滤,然后按分数排序,然后仅映射 myKey

var people = [ 
{ 'myKey': 'A', 'status': 0, score: 1.5 },
{ 'myKey': 'C', 'status': 1, score: 2.0 },
{ 'myKey': 'D', 'status': 0, score: 0.2 },
{ 'myKey': 'E', 'status': 1, score: 1.0 },
{ 'myKey': 'F', 'status': 0, score: 0.4 },
{ 'myKey': 'G', 'status': 1, score: 3.0 },
];

var result = people.filter(function(i) {
    return i.status == 1;
    })
    .sort(function (a, b) {
        if (a.score == b.score) return 0;
        if (a.score > b.score) return 1;
        return -1;
    }).map(function(i) {
        return i.myKey;
    });

http://jsfiddle.net/GrYuK/1/

于 2013-04-22T08:54:26.053 回答
1

忍受另一组答案,我准备了一个链接,您可以查看更多详细信息。

  (function getPeopleStatus (person){
    for(var ctr = 0; ctr< person.length; ctr++){

    if(person[ctr].status === 1){
        selection.push(person[ctr]);
    }

}
    selection.sort()
  })(people);
于 2013-04-22T09:01:34.830 回答