【问题标题】:Sorting based on 2 key value pairs in javascript基于javascript中的2个键值对排序
【发布时间】:2019-04-24 05:46:04
【问题描述】:

我有一个对象数组,每个对象都包含一个嵌套数组。我需要根据嵌套数组中的 ID 过滤主数组。应从结果中删除具有重复 ID 的对象。

对象数组有嵌套数组,其中有两个参数:"AuN": "sanjay mittal" 和对应的"AuId"。我需要根据"AuN": "sanjay mittal" 附带的"AuId" 的值使我的主数组对象独一无二

数据:

[
    {
        "CC": 623,
        "AA": [
            {
                "AuN": "tayfun e tezduyar",
                "AuId": 166714465
            },
            {
                "AuN": "sanjay mittal",
                "AuId": 2141608163
            }
        ],
        "PK": 2009478656
    },
     {
        "CC": 488,
        "AA": [
            {
                "AuN": "tayfun e tezduyar",
                "AuId": 166714465
            },
            {
                "AuN": "marek behr",
                "AuId": 2117578800
            },
            {
                "AuN": "sanjay mittal",   
                "AuId": 2141608163        // duplicate data. Need to remove the main object
            }
        ],
        "PK": 1973948837
    },
    {
        "CC": 118,
        "AA": [
            {
                "AuN": "rajendra k premchand",
                "AuId": 1987062001
            },
            {
                "AuN": "kamal sharma",
                "AuId": 2426730634
            },
            {
                "AuN": "sanjay mittal",
                "AuId": 2583035735
            },
            {
                "AuN": "inder s anand",
                "AuId": 1907699963
            }
        ],
        "PK": 2116095873
    },
    {
        "CC": 401,
        "AA": [
            {
                "AuN": "sanjay mittal",
                "AuId": 2123420744
            },
            {
                "AuN": "brian falkenhainer",
                "AuId": 68193438
            }
        ],
        "PK": 153230822
    },
    {
        "CC": 86,
        "AA": [
           {
                "AuN": "sanjay mittal",
                "AuId": 2123420744
            },
            {
                "AuN": "shulian shang",
                "AuId": 2723036630
            },
            {
                "AuN": "todd j mortier",
                "AuId": 2063047595
            },
            {
                "AuN": "cyril j schweich",
                "AuId": 2132794328
            }
        ],
        "PK": 2021819698
    }
]

预期结果:

我的预期结果基于名称 "AuN": "sanjay mittal" 和唯一的 "AuId" 删除了一些主要对象:

var expectedArray = [
    {
        "CC": 623,
        "AA": [
            {
                "AuN": "tayfun e tezduyar",
                "AuId": 166714465
            },
            {
                "AuN": "sanjay mittal",
                "AuId": 2141608163
            }
        ],
        "PK": 2009478656
    },
    {
        "CC": 118,
        "AA": [
            {
                "AuN": "rajendra k premchand",
                "AuId": 1987062001
            },
            {
                "AuN": "kamal sharma",
                "AuId": 2426730634
            },
            {
                "AuN": "sanjay mittal",
                "AuId": 2583035735
            }
            {
                "AuN": "inder s anand",
                "AuId": 1907699963
            }
        ],
        "PK": 2116095873
    },
    {
        "CC": 401,
        "AA": [
            {
                "AuN": "sanjay mittal",
                "AuId": 2123420744
            },
            {
                "AuN": "brian falkenhainer",
                "AuId": 68193438
            }
        ],
        "PK": 153230822
    },
]

我正在尝试找到一种有效的方法来做到这一点。任何见解和方法都可以帮助我实现这一目标。

【问题讨论】:

标签: javascript arrays sorting object arrayobject


【解决方案1】:

您可以为此使用Map。通过相关的 AuId 对其进行键控,并为其存储相应的顶级对象。如果您以相反的顺序执行此操作,则相同 AuId 的第一次出现将在地图中保留。

然后只需再次从地图中取出这些对象即可完成:

const array = [{"CC":623,"AA":[{"AuN":"tayfun e tezduyar","AuId":166714465},{"AuN":"sanjay mittal","AuId":2141608163}],"PK":2009478656},{"CC":488,"AA":[{"AuN":"tayfun e tezduyar","AuId":166714465},{"AuN":"marek behr","AuId":2117578800},{"AuN":"sanjay mittal","AuId":2141608163}],"PK":1973948837},{"CC":118,"AA":[{"AuN":"rajendra k premchand","AuId":1987062001},{"AuN":"kamal sharma","AuId":2426730634},{"AuN":"sanjay mittal","AuId":2583035735},{"AuN":"inder s anand","AuId":1907699963}],"PK":2116095873},{"CC":401,"AA":[{"AuN":"sanjay mittal","AuId":2123420744},{"AuN":"brian falkenhainer","AuId":68193438}],"PK":153230822},{"CC":86,"AA":[{"AuN":"sanjay mittal","AuId":2123420744},{"AuN":"shulian shang","AuId":2723036630},{"AuN":"todd j mortier","AuId":2063047595},{"AuN":"cyril j schweich","AuId":2132794328}],"PK":2021819698}];

const map = new Map(array.reverse().map(obj => 
    [obj.AA.find(({AuN}) => AuN === "sanjay mittal").AuId, obj]
));
const filtered = Array.from(map.values()).reverse();
console.log(filtered);

此代码假定每个对象都有这样的“sanjay mittal”条目。如果这不能保证,那么您需要添加一些测试并决定如何处理这种“孤立”对象。

补充:

在您提到的 cmets 中,您收到关于 AuId 属性的错误。这意味着上面最后一段中的假设不正确。因此,您可以如何处理这种情况:

const array = [{"CC":623,"AA":[{"AuN":"tayfun e tezduyar","AuId":166714465},{"AuN":"sanjay mittal","AuId":2141608163}],"PK":2009478656},{"CC":488,"AA":[{"AuN":"tayfun e tezduyar","AuId":166714465},{"AuN":"marek behr","AuId":2117578800},{"AuN":"sanjay mittal","AuId":2141608163}],"PK":1973948837},{"CC":118,"AA":[{"AuN":"rajendra k premchand","AuId":1987062001},{"AuN":"kamal sharma","AuId":2426730634},{"AuN":"sanjay mittal","AuId":2583035735},{"AuN":"inder s anand","AuId":1907699963}],"PK":2116095873},{"CC":401,"AA":[{"AuN":"s*a*n*jay mittal","AuId":2123420744},{"AuN":"brian falkenhainer","AuId":68193438}],"PK":153230822},{"CC":86,"AA":[{"AuN":"sanjay mittal","AuId":2123420744},{"AuN":"shulian shang","AuId":2723036630},{"AuN":"todd j mortier","AuId":2063047595},{"AuN":"cyril j schweich","AuId":2132794328}],"PK":2021819698}];

const map = new Map(array.reverse().map((obj, i) => {
    const found = obj.AA.find(({AuN}) => AuN === "sanjay mittal");
    if (found) return [found, obj];
    return [-i, [...obj.AA, { "AuN":"sanjay mittal","AuId": "missing" }]];
}));
const filtered = Array.from(map.values()).reverse();
console.log(filtered);

这将检测“sanjay mittal”条目的缺失,然后将认为该对象不是重复的,并将条目“sanjay mittal”/“missing”添加到过滤后的数据中。

【讨论】:

  • 是否有任何其他方法可以实现这一点,因为在我执行此操作时似乎存在问题。我得到未定义的 AuId,响应与上述相同。
  • 如果响应相同,那么您必须在我的回答中执行其他操作:当您在我的回答中运行 sn-p 时,它适用于该特定响应。如果您得到未定义的 AuId,则意味着您的输入中有一个条目没有“sanjay mittal”条目。如果您愿意,我可以更新代码,以便它能够检测到这种情况并提供更用户友好的输出。
  • 查看我的答案。
  • 这仅显示带有作者姓名的对象数组,并将缺少的 sanjay mittal 添加到结果中
  • 任何其他方法来对抗同样的事情。因为我已经在我的节点 js 项目中实现了这个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多