javascript - 如何过滤对象数组?
问题描述
我有一张桌子
并且此表作为带有对象的数组,一个对象 = 表的一行
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 }
]
我需要删除具有相同数字的行并留下其中之一。行中的数字可以按不同的顺序排列。
可视化结果,过滤后的表格:
解决方案
这是将列表转换为唯一数字数组的一种方法:
对于列表中的每个对象,
对数值进行排序:
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);
推荐阅读
- google-bigquery - 我的 PowerBI 报告(由 Google Bigquery 提供)在线时无法刷新,我做错了什么?
- c - 有效地将文件中的数据送入环形缓冲区
- vb.net - 使用 EWS,CcRecipients 和 DisplayCc 不匹配
- bash - Bash 选择格式
- android - 我是编程新手。我正在尝试制作 android app soundrecoder
- sql - 在where子句中带有大小写的sql
- okta - IOS 10 上 React Native 中的 Okta
- sandcastle - Sandcastle 帮助文件生成器在线发布
- django - django迁移文件中依赖数组的目的是什么
- javascript - JS 用 event.target 获取被点击的元素