Javascript使用本机函数基于多个条件过滤数组

Javascript使用本机函数基于多个条件过滤数组,javascript,arrays,node.js,Javascript,Arrays,Node.js,我有一种情况,需要根据特定条件过滤对象数组。这是什么 有一个错误响应,响应是一个对象数组。每个对象都有节点消息,类型,键值 keyValues是一个数组,最多可以有3个不同的项。每个元素的节点是键和值 键可以具有以下三个值之一:按日期,按唯一对象,按相关对象 按日期的值将具有日期对象的值 按唯一对象的值,按相关对象的将对象作为 uri具有特定的模式,并且这两种类型的按唯一对象,按相关对象 因此,从给定的错误数组中,我只需要过滤那些只按日期获得的记录,而不应该有其他两种类型的URI模式 这

我有一种情况,需要根据特定条件过滤对象数组。这是什么

  • 有一个错误响应,响应是一个对象数组。每个对象都有节点
    消息
    类型
    键值
  • keyValues
    是一个数组,最多可以有3个不同的项。每个元素的节点是
  • 可以具有以下三个值之一:按日期,
    按唯一对象
    按相关对象
  • 按日期<代码>的值将具有日期对象的值
  • 按唯一对象<代码>的值,按相关对象<代码>的<代码>将对象作为
  • uri
    具有特定的模式,并且这两种类型的
    按唯一对象
    按相关对象
因此,从给定的错误数组中,我只需要过滤那些只按日期获得的记录,而不应该有其他两种类型的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"))