从具有多个条件的数组中过滤记录,然后按id对结果进行排序

时间:2017-03-20 10:37:06

标签: javascript

下面是我的数组:



var array1 =[
    {
      "id": 77,
      "selected" : false
    },
    {
      "id": 76,
      "selected" : true
    },
    {
     "id": 75,
      "selected" : true
    },
    {
      "id": 74,
      "selected" : false
    },
    {
      "id": 73,
      "selected" : true
    }
  ];
  
  var obj = { "id" : 74, "selected" : true  };
  
  
for (var i = 0; i < array1.length; i++) {

            }
&#13;
&#13;
&#13;

所以现在我想首先只获取那些选择属性为true的记录,然后按ID按降序对记录进行排序,然后从74选择属性为真的>选择紧接的前一条记录。

例如: 75是74的选定属性为true的前一个记录。如果75的选定属性是假的,那么如果我们从74开始上升,我们应该选择76。

预期输出:

 {
     "id": 75,
      "selected" : true
   }

代码:

for (var i = 0; i < array1.length; i++) {

            }

这里我没有得到如何通过id = 74过滤记录并使用true选择,然后按id降序排序记录并选择上一条记录。

4 个答案:

答案 0 :(得分:3)

由于你需要紧接排序的74之前的记录,这里我按升序排序并立即获取记录。同样但更容易编码。

&#13;
&#13;
var array1 =[
    {
      "id": 77,
      "selected" : false
    },
    {
      "id": 76,
      "selected" : true
    },
    {
     "id": 75,
      "selected" : true
    },
    {
      "id": 74,
      "selected" : false
    },
    {
      "id": 73,
      "selected" : true
    }
  ];

var el = array1.sort(function (a,b) {
  if (a.id < b.id) return -1;
  return 1;
}).find(function (a) {
  return a.selected && a.id > 74;
});

console.log(el);
&#13;
&#13;
&#13;

答案 1 :(得分:2)

&#13;
&#13;
const array1 = [{
    "id": 77,
    "selected": false
  },
  {
    "id": 76,
    "selected": true
  },
  {
    "id": 75,
    "selected": true
  },
  {
    "id": 74,
    "selected": false
  },
  {
    "id": 73,
    "selected": true
  }
];

const obj = { "id" : 74, "selected" : true  };
let output = {};

let index = array1.map(a=>a.id).indexOf(obj.id); //Find the index of obj

//Iterate array1 from the index to 0
//Check is selected is true
for(let i=index-1;i>=0;i--){
  if(array1[i].selected){
    output = array1[i];
    break;
  }
}
console.log(output);
&#13;
&#13;
&#13;

答案 2 :(得分:2)

您可以使用Array#reduce并测试对象,如果它与过滤器匹配并获得大于或等于所需的最小id

var array = [{ id: 77, selected: false }, { id: 76, selected: true }, { id: 75, selected: true }, { id: 74, selected: false }, { id: 73, selected: true }],
    filter = { id: 74, selected: true },
    result = array.reduce(function (r, a) {
        return a.selected === filter.selected && a.id > filter.id && (r && a.id < r.id || !r) ? a : r;
    }, undefined);

console.log(result);

答案 3 :(得分:0)

使用此脚本。

$().ready(function () {
var array1 = [
{
"id": 77,
"selected": false
},
{
"id": 76,
"selected": true
},
{
"id": 75,
"selected": true
},
{
"id": 74,
"selected": false
},
{
"id": 73,
"selected": true
}
];

var filterData = $(array1).filter(function (i, n) { return n.selected === true });
filterData = filterData.sort(function (a, b) { return a.id - b.id });
$.each(filterData, function (i, item) {
    console.log(item);
});
});
	<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.2/jquery.min.js"></script>