多个条件过滤数组"/>
Javascript使用本机函数基于多个条件过滤数组
我有一种情况,需要根据特定条件过滤对象数组。这是什么
- 存在错误响应,该响应是对象数组。每个对象都有节点
message
,type
,keyValues
keyValues
是一个数组,最多可以有3个不同的项目。每个元素的节点为key
&value
- [
key
可以具有以下3个值之一by-date
,by-unique-object
,by-related-object
by-date
的值将具有该值作为日期对象by-unique-object
的值,by-related-object
的对象为
value: {
uri: "object-uri-1"
}
uri
具有特定的模式,并且对于by-unique-object
,by-related-object
两种类型都相同。
所以,从给定的错误数组中,我只需要过滤仅获得by-date
且不应该具有URI模式类型的其他2种类型的记录
我在这里做了-
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
===“ by-date”的对象
我不能说这比您提供的更好或更糟,因为我不确定您可能还会如何使用此代码。但我想对问题做出自己的解释。
更多推荐
Javascript使用本机函数基于多个条件过滤数组
发布评论