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

例:
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 },
];

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

阅读 2.3k
4 个回答

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题