Javascript使用本机函数基于多个条件过滤数组
我有一种情况,需要根据特定条件过滤对象数组。这是什么Javascript使用本机函数基于多个条件过滤数组,javascript,arrays,node.js,Javascript,Arrays,Node.js,我有一种情况,需要根据特定条件过滤对象数组。这是什么 有一个错误响应,响应是一个对象数组。每个对象都有节点消息,类型,键值 keyValues是一个数组,最多可以有3个不同的项。每个元素的节点是键和值 键可以具有以下三个值之一:按日期,按唯一对象,按相关对象 按日期的值将具有日期对象的值 按唯一对象的值,按相关对象的将对象作为 uri具有特定的模式,并且这两种类型的按唯一对象,按相关对象 因此,从给定的错误数组中,我只需要过滤那些只按日期获得的记录,而不应该有其他两种类型的URI模式 这
- 有一个错误响应,响应是一个对象数组。每个对象都有节点
,消息
,类型
键值
是一个数组,最多可以有3个不同的项。每个元素的节点是keyValues
和键
值
可以具有以下三个值之一:按日期,键
,按唯一对象
按相关对象
- 按日期<代码>的值将具有日期对象的值
- 按唯一对象<代码>的值,按相关对象<代码>的<代码>将对象作为
具有特定的模式,并且这两种类型的uri
,按唯一对象
李>按相关对象
let errors = [
{
message: "Error message 1",
type: "error",
keyValues: [
{
key: "by-date",
value: {
date: {year:2020, month: 4, day: 6}
}
},
{
key: "by-unique-object",
value: {
uri: "object-uri-1"
}
},
{
key: "by-related-object",
value: {
uri: "object-uri-1"
}
},
]
},
{
message: "Error message 2",
type: "error",
keyValues: [
{
key: "by-date",
value: {
date: {year:2020, month: 4, day: 5}
}
}
]
},
{
message: "Error message 3",
type: "error",
keyValues: [
{
key: "by-date",
value: {
date: {year:2020, month: 4, day: 6}
}
},
{
key: "by-unique-object",
value: {
uri: "object-uri-3"
}
}
]
},
{
message: "Error message 4",
type: "warning",
keyValues: [
{
key: "by-unique-object",
value: {
uri: "object-uri-4"
}
},
{
key: "by-related-object",
value: {
uri: "object-uri-4"
}
}
]
},
{
message: "Error message 5",
type: "warning",
keyValues: [
{
key: "by-date",
value: {
date: {year:2020, month: 4, day: 8}
}
},
{
key: "by-related-object",
value: {
uri: "object-uri-4"
}
}
]
},
{
message: "Error message 6",
type: "warning",
keyValues: [
{
key: "by-date",
value: {
date: {year:2020, month: 4, day: 9}
}
}
]
}
];
const matchObjectUriPattern = (uri) => /object-uri-.*/g.test(uri);
const hasByDate = (item) => item.key === "by-date" && item.value && item.value.date;
const hasUniqueObject = (item) => item.key === "by-unique-object" && matchObjectUriPattern(item.value.uri);
const hasRelatedObject = (item) => item.key === "by-related-object" && matchObjectUriPattern(item.value.uri);
const checkOnlyByDate = (error) => {
let keyValues = error && error.keyValues ? error.keyValues : [];
let byDate = keyValues.find(hasByDate);
let byUniqueObject = keyValues.find(hasUniqueObject);
let byRelatedObject = keyValues.find(hasRelatedObject);
return byDate && (!byUniqueObject && !byRelatedObject);
};
const filteredErrors = errors.filter(checkOnlyByDate);
console.log(JSON.stringify(filteredErrors));
我做的很好,但是有更好的方法吗?或者更好的方法来处理这个问题?我喜欢你的解决方案!根据您的要求,我提出了:
const filteredErrors = errors.filter(({keyValues}) =>
keyValues.every(({key}) => key === "by-date"))
它仅返回其keyValues
数组仅包含带有key
=“按日期”的对象的错误消息
我不能说这比您提供的更好或更差,因为我不确定您还可能如何使用此代码。但是我想添加我自己对这个问题的解释。有趣的是,我完全错过了这个数组。prototype.every()就是用来做这个工作的!!我最终得到了这么多的代码。这就是我想要的代码更少但超级有效。谢谢你,在这种困难的情况下保持安全!!
const filteredErrors = errors.filter(({keyValues}) =>
keyValues.every(({key}) => key === "by-date"))