最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

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

网站源码admin24浏览0评论

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

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

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

  • 存在错误响应,该响应是对象数组。每个对象都有节点messagetypekeyValues
  • keyValues是一个数组,最多可以有3个不同的项目。每个元素的节点为keyvalue
  • [key可以具有以下3个值之一by-dateby-unique-objectby-related-object
  • by-date的值将具有该值作为日期对象
  • by-unique-object的值,by-related-object的对象为

    value: {
       uri: "object-uri-1"
    }

  • uri具有特定的模式,并且对于by-unique-objectby-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”的对象

我不能说这比您提供的更好或更糟,因为我不确定您可能还会如何使用此代码。但我想对问题做出自己的解释。

发布评论

评论列表(0)

  1. 暂无评论