求助:有没有什么好的过滤出相同数组对象的方法?

2023-06-16 281 0

例:
let arr = [
  { id: 1, name: 'Alice', age: 20 },
  { id: 2, name: 'Bob', age: 21 },
  { id: 3, name: 'Charlie', age: 20 },
  { id: 4, name: 'David', age: 22 },
  { id: 5, name: 'Eve', age: 23 },
  { id: 6, name: 'Frank', age: 24 }
];

结果:

let arr = [
  { id: 1, name: 'Alice', age: 20 },
  { id: 3, name: 'Charlie', age: 20 },
];

我想过滤出这样的数组形式,有没有什么好的方式处理

image.png

  let arr = [
    { id: 1, name: 'Alice', age: 20 },
    { id: 2, name: 'Bob', age: 21 },
    { id: 3, name: 'Charlie', age: 20 },
    { id: 4, name: 'David', age: 22 },
    { id: 5, name: 'Eve', age: 23 },
    { id: 6, name: 'Frank', age: 24 },
    { id: 7, name: 'Frank', age: 24 }
  ];
  let result = Object.values(arr.reduce((acc, item) => {
    if (!acc[item.age]) acc[item.age] = [item];
    else acc[item.age].push(item);
    return acc;
  }, {})).filter(value => value.length > 1).flat();
  console.log(result);
Object.values([
{ id: 1, name: 'Alice', age: 20 },
{ id: 2, name: 'Bob', age: 21 },
{ id: 3, name: 'Charlie', age: 20 },
{ id: 4, name: 'David', age: 22 },
{ id: 5, name: 'Eve', age: 23 },
{ id: 6, name: 'Frank', age: 24 }
].reduce((res, v) => ( (res[v.age] ||= []).push(v), res), {}))
.reduce((res, arr) => arr.length > 1 ? res.concat(arr) : res, [])
function filterArr(arr, params) {
const paramKeys = Object.keys(params);
return arr.filter(item => {
return paramKeys.every(key => {
return item[key] === params[key];
});
});
}
// 调用
const arr = [
{ id: 1, name: 'Alice', age: 20 },
{ id: 2, name: 'Bob', age: 21 },
{ id: 3, name: 'Charlie', age: 20 },
{ id: 4, name: 'David', age: 22 },
{ id: 5, name: 'Eve', age: 23 },
{ id: 6, name: 'Frank', age: 24 }
];
filterArr(arr, { age: 20 }); // length: 2
filterArr(arr, { age: 20, id: 3 }); // length: 1
import { from, toArray } from "ix/iterable";
import { filter, groupBy, map } from "ix/iterable/operators";
function pickSame(arr, f) {
return toArray(
from(arr).pipe(
groupBy(f),
map((x) => toArray(x)),
filter((x) => 1 < x.length)
)
);
}
const arr = [
{ id: 1, name: "Alice", age: 20 },
{ id: 2, name: "Bob", age: 21 },
{ id: 3, name: "Charlie", age: 20 },
{ id: 4, name: "David", age: 22 },
{ id: 5, name: "Eve", age: 23 },
{ id: 6, name: "Frank", age: 24 }
];
console.log(pickSame(arr, (x) => x.age));

codesandbox

回答

相关文章

nuxt2部署静态化和ssr的时候访问首页先报404再出现首页为什么?
`clip-path` 如何绘制圆角平行四边形呢?
多线程wait方法报错?
VUE 绑定的方法如何直接使用外部函数?
vue2固定定位该怎么做?
谁有redis实现信号量的代码,希望借鉴一下?