javascript - 通过另一个 true 标记的子键对象过滤对象数组

标签 javascript arrays ecmascript-6 filter

我正在尝试通过此处的另一个对象过滤对象列表示例

// the list need to be filtered 
const list  = [
  {
    "id": 1,
    "name": "Loraine Mueller",
    "avatar": "https://s3.amazonaws.com/uifaces/faces/twitter/BroumiYoussef/128.jpg",
    "status": "offline",
    "language": "German",
    "rating": 4,
    "reviews": 4308
  },
  {
    "id": 2,
    "name": "Katarina Kilback",
    "avatar": "https://s3.amazonaws.com/uifaces/faces/twitter/dvdwinden/128.jpg",
    "status": "online",
    "language": "German",
    "rating": 5,
    "reviews": 8484
  }
]
const filterBy = {
 status: {
  online: true,
  offline: false
 },
 language: {
  english: true,
  german: false
 }
}

实现 _filterList(list, filterBy) 的想法:返回包含在线和德国项目的过滤列表

我尝试了什么

const _filter = (rows, filterBy) => {
  let result = [...rows];
  Object.keys(filterBy)
    .map(key => result = [...result.filter(row => filterBy[key].includes(row[key]))]);
  return result;
}

最佳答案

假设您想要的结果是给定的过滤器键是列表中的任何值,则为 filter/every/includes 的组合> 诀窍是:

const list = [
  {
    id: 1,
    name: "Loraine Mueller",
    status: "offline",
    language: "German",
    rating: 4,
    reviews: 4308,
  },
  {
    id: 2,
    name: "Katarina Kilback",
    status: "online",
    language: "German",
    rating: 5,
    reviews: 8484,
  },
];

function filterBy(list, filters) {
  return list.filter(ent =>
    Object.keys(filters).every(filterKey =>
      filters[filterKey].includes(ent[filterKey]),
    ),
  );
}

console.log(
  filterBy(list, {
    status: ["online"],
    language: ["German"],
  }),
);

仅输出卡特琳娜。

编辑:根据评论,我们还需要将过滤器对象转换为这种形状。当然可以。

function transformFilters(filterBy) {
  const transformedFilters = {};
  for (var key in filterBy) {
    const values = [];
    for (var value in filterBy[key]) {
      if (filterBy[key][value]) {
        values.push(value);
      }
    }
    if (values.length) {
      transformedFilters[key] = values;
    }
  }
  return transformedFilters;
}

console.log(
  transformFilters({
    status: {
      online: true,
      offline: false,
    },
    language: {
      english: true,
      german: false,
    },
  }),
);

输出

{ status: [ 'online' ], language: [ 'english' ] }

关于javascript - 通过另一个 true 标记的子键对象过滤对象数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57884467/

相关文章:

字符缓冲区输入超过 256 个字符

python - 如何拆分数组数组?

javascript - 在 mapDispatchToProps 中传递事件对象和参数

javascript - 检查一个字符串的任何字符是否在另一个字符串javascript中的最佳方法

javascript - 如何获取动态创建的 slider 的值?

javascript - 我无法使用 Javascript 验证验证码是否错误

javascript - 根据url隐藏div,但Head中有JS

c - 使用指向数组层的指针遍历数组层

javascript - 如何删除 React Native 中的警告

javascript - es6 Array Reduce处理第一个被减少的项目