JavaScript使用本机函数根据多种条件过滤数组

时间:2020-04-11 12:01:00

标签: javascript arrays node.js

我遇到一种情况,我需要根据某些条件过滤对象数组。这是什么

  • 有一个错误响应,该响应是一个对象数组。每个对象都有节点messagetypekeyValues
  • keyValues是一个数组,最多可以包含3个不同的项目。每个元素的节点为keyvalue
  • key可以具有以下3个值之一by-dateby-unique-objectby-related-object
  • by-date
  • 值将具有作为日期对象的值
  • by-unique-objectby-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)); 

我做的很好,但是有更好的方法吗?还是一些更好的方法来解决这个问题?

1 个答案:

答案 0 :(得分:1)

我喜欢您的解决方案!根据您的要求,我想到了:

const filteredErrors = errors.filter(({keyValues}) => 
  keyValues.every(({key}) => key === "by-date"))

仅返回那些错误消息,这些错误消息的keyValues数组仅包含具有key ===“ by-date”的对象

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