首页 > 解决方案 > 如何根据一个对象内的字段过滤对象数组?

问题描述

我有一个这种形式的数组:

[
  {
    username: '',
    id: '',
    moreInfo: {
      infoDate: ''
    }
  }
]

而且我需要根据 infoDate 进行过滤,无论它是否在两个特定日期之间。

我有一个接受对象的函数,以及搜索范围并返回的字段:

return resultDate >= fromDate && resultDate <= thruDate;

但是我该如何过滤这样的数组。我试过了

userData.filter(userData => functionthatFiltersDate(userData.moreInfo, {from,thru}, 'infoDate')

函数thatFiltersDate 是一个函数,它接受一个对象作为输入和日期来检查范围:

functionthatFiltersDate = (
  result,
  { fromDate, thruDate },
  fieldName
) => {
  let resultDate = result[fieldName];
  if (!isDate(resultDate)) {
    resultDate = moment(result[fieldName]).toDate();
  }
  if  (!isDate(fromDate)) {
    fromDate = moment(fromDate).toDate();
  }
  if (!isDate(thruDate)) {
    thruDate = moment(thruDate).toDate();
  }
  return resultDate >= fromDate && resultDate <= thruDate;
};

如何根据内部的另一个对象属性过滤对象数组?任何帮助表示赞赏!

标签: javascriptecmascript-6

解决方案


以这种方式调用您的函数:

function fooBar(item ){
    // ....
    // return truthy condition
};

var result = arr.filter(fooBar);

-

将参数传递给过滤器函数:

const fruits = ['apple', 'banana', 'grapes', 'mango', 'orange'];

/**
 * Array filters items based on search criteria (query)
 */
const filterItems = (query) => {
  return fruits.filter((el) =>
    el.toLowerCase().indexOf(query.toLowerCase()) > -1
  );
}

console.log(filterItems('ap')); // ['apple', 'grapes']
console.log(filterItems('an')); // ['banana', 'mango', 'orange']

资料来源:Mozilla Docs

-

基于嵌套值过滤数组:

var arr = [
 {foo: 'item1', nested: {nestedFoo: 'returnThis'} },
 {foo: 'item2', nested: {nestedFoo: 'notThis'} },
];

var result = arr.filter(item => item.nested.nestedFoo == 'returnThis');
// result variable now contains an array with one object
console.log(result) // array
console.log(result[0]) // object
console.log(result[0].foo) // 'item1'

有关如何访问嵌套值的说明,请参阅此问题

-

让它更清楚:

var arr = [
  {
    username: '',
    id: '',
    moreInfo: {
      infoDate: ''
    }
  },
  {
    username: '',
    id: '',
    moreInfo: {
      infoDate: ''
    }
  },
 ...
];

const filterItems = (fromDate, thruDate, fieldName) => {
  return arr.filter((item) =>
    item.moreInfo.infoDate >= fromDate && item.moreInfo.infoDate < thruDate
  );
}

推荐阅读