首页 > 解决方案 > 如何过滤对象数组?

问题描述

我有一张桌子

在此处输入图像描述

并且此表作为带有对象的数组,一个对象 = 表的一行

var list = [
    { "n1": 18, "n2": 1, "n3": 5, "n4": 17 },
    { "n1": 1, "n2": 2, "n3": 11, "n4": 6 },
    { "n1": 1, "n2": 5, "n3": 11, "n4": 12 },
    { "n1": 6, "n2": 17, "n3": 12, "n4": 1 },
    { "n1": 4, "n2": 7, "n3": 8, "n4": 20 },
    { "n1": 2, "n2": 3, "n3": 8, "n4": 7 },
    { "n1": 2, "n2": 8, "n3": 7, "n4": 6 },
    { "n1": 14, "n2": 15, "n3": 11, "n4": 10 },
    { "n1": 11, "n2": 8, "n3": 16, "n4": 15 },
    { "n1": 20, "n2": 4, "n3": 8, "n4": 7 },
    { "n1": 11, "n2": 12, "n3": 6, "n4": 14 },
    { "n1": 1, "n2": 5, "n3": 12, "n4": 11 },
    { "n1": 17, "n2": 12, "n3": 5, "n4": 1 },
    { "n1": 8, "n2": 9, "n3": 13, "n4": 19 },
    { "n1": 8, "n2": 9, "n3": 19, "n4": 15 },
    { "n1": 10, "n2": 9, "n3": 15, "n4": 8 },
    { "n1": 11, "n2": 12, "n3": 17, "n4": 6 },
    { "n1": 8, "n2": 7, "n3": 20, "n4": 4 }
]

我需要删除具有相同数字的行并留下其中之一。行中的数字可以按不同的顺序排列。

可视化结果,过滤后的表格:

在此处输入图像描述

标签: javascript

解决方案


这是将列表转换为唯一数字数组的一种方法:

对于列表中的每个对象,

对数值进行排序:

const vals = Object.values(obj).sort((a, b) => a - b);

形成要存储在散列对象中的数值的字符串散列:

let valuesHashed = {};
...
let hash = vals.reduce((acc, curr) => acc + "," + String(curr));
... 
valuesHashed[hash] = true;

然后检查列表中的后续对象是否在哈希对象中。

var list = [
  { n1: 18, n2: 1, n3: 5, n4: 17 },
  { n1: 1, n2: 2, n3: 11, n4: 6 },
  { n1: 1, n2: 5, n3: 11, n4: 12 },
  { n1: 6, n2: 17, n3: 12, n4: 1 },
  { n1: 4, n2: 7, n3: 8, n4: 20 },
  { n1: 2, n2: 3, n3: 8, n4: 7 },
  { n1: 2, n2: 8, n3: 7, n4: 6 },
  { n1: 14, n2: 15, n3: 11, n4: 10 },
  { n1: 11, n2: 8, n3: 16, n4: 15 },
  { n1: 20, n2: 4, n3: 8, n4: 7 },
  { n1: 11, n2: 12, n3: 6, n4: 14 },
  { n1: 1, n2: 5, n3: 12, n4: 11 },
  { n1: 17, n2: 12, n3: 5, n4: 1 },
  { n1: 8, n2: 9, n3: 13, n4: 19 },
  { n1: 8, n2: 9, n3: 19, n4: 15 },
  { n1: 10, n2: 9, n3: 15, n4: 8 },
  { n1: 11, n2: 12, n3: 17, n4: 6 },
  { n1: 8, n2: 7, n3: 20, n4: 4 }
];

let valuesHashed = {};
let uniques = [];
list.forEach(obj => {
  // create array of sorted values
  const vals = Object.values(obj).sort((a, b) => a - b);
  // form hash string of sorted values, use has as key to hash object
  let hash = vals.reduce((acc, curr) => acc + "," + String(curr));
  // add object to uniques if not yet in hash object
  if (!valuesHashed[hash]) {
    uniques.push(obj);
  }
  // add vales to hash object
  valuesHashed[hash] = true;
});

console.log("valuesHashed:", valuesHashed);

console.log("uniques:", uniques);


推荐阅读