如何动态筛选包含各种对象结构的数组



我的用法将包含6种不同的对象类型(有些包含双嵌套数组(,以及任何可能的条目数量,条件是给定的条目是唯一的。

这些对象没有一致的唯一标识符(提交时在后端应用唯一标识符(。

下面是数组的一个例子(只有两种对象类型(:

arr = [
{name:"aaa",time:15},
{name:"aaa",time:22},

{timeline: "250", chars[{a},{b},{c}]},
{timeline: "220", chars[{d},{e},{f}]},
]

obj = {name:"aaa",time:22}

我的意图是根据obj是否在arr内来获得truefalse

我尝试过的方法:

  1. 有人建议我用这种方法&it错误:#<Object> is not a function
console.log(arr.find(obj))
  1. 我也发现了这个建议,但即使存在元素,它也总是返回false
console.log(arr.includes(object))
  1. 我自己尝试过这种方法,尽管它总是会失败
console.log(arr.filter((element, index) => element === obj)

对于attempt 4,如果我要比较name,这将是不够的,因为缺少有效条目会忽略唯一时间。

如果我传递每个字段,这也不会起作用,因为每个对象可能有字段,也可能没有字段,从而导致错误。

手动将过滤器预过滤到不同的类别中是不可能的,因为每次添加新类型时都需要手动添加到过滤器中。

如果你知道有一个图书馆可以做到这一点,请告诉我,因为那将是完美的。否则,任何其他建议(不包括分离数组(都将不胜感激。

使用arr.some()检查所需对象是否存在于数组中。

要比较对象,一种更简单的方法是对两个对象进行字符串化并进行比较。

const arr = [
{name:"aaa",time:15},
{name:"aaa",time:22},
{name: "aaa", chars: ["a", "b", "c"]},
{name: "bbb", chars: ["d", "e", "f"]},
]
const obj1 = {name:"aaa", time: 15}
const obj2 = {name:"aaa",chars: ["a", "b", "c"]}
console.log(arr.some((element) => JSON.stringify(element) === JSON.stringify(obj1)))   // true
console.log(arr.some((element) => JSON.stringify(element) === JSON.stringify(obj2)))   // true

没有太多考虑性能。

我在这里没有太多考虑性能,但这可能会有所帮助:

function checkObjectInArray(arr, obj) {
const res = arr.some((el) => deepEqual(el, obj));
console.log(res);
}
function deepEqual(obj1, obj2) {
if (Object.keys(obj1).length !== Object.keys(obj2).length) return false;
for (let prop in obj1) {
if (!obj2.hasOwnProperty(prop) || obj2[prop] !== obj1[prop]) {
return false;
}
}
return true;
}

在你的情况下,你可以像这样使用它:

arr = [
{ name: "aaa", time: 15 },
{ name: "aaa", time: 22 },
{ timeline: "250", data: ["2", "3", "4"] },
{ timeline: "251", data: ["2", "3", "4"] },  // what is chars[{d},{e},{f}] ?!
];
obj = { name: "aaa", time: 22 };
checkObjectInArray(arr, obj);

观察: arr不是有效数组。嵌套的chars不包含有效值。

解决方案: 您可以通过将JSON对象转换为JSON字符串并进行比较来简单地实现需求。

这个解决方案运行良好,因为您只是试图在传递的arr中找到一个对象。

实时演示

const arr = [
{name:"aaa",time:15},
{name:"aaa",time:22},  
{timeline: "250", chars: [{a: 1},{b: 2},{c: 3}]},
{timeline: "220", chars: [{d: 4},{e: 5},{f: 6}]},
];

const obj = {name:"aaa",time:22};
const res = JSON.stringify(arr).indexOf(JSON.stringify(obj)) !== -1 ? true : false;
console.log(res);

最新更新