如果对象存在于另一个数组中,则从数组中删除对象

问题描述 投票:0回答:1

我现在正在探索 JSONAta 是为了好玩,并且有一个关于如何解决问题的问题。

我想根据整个对象的匹配从一个数组中删除存在于另一个数组中的对象(或者如果不可能,则在 Code 属性上进行匹配)。例如:

$largerArray := [{"Name": "A", "Code": "100"} ,{"Name": "B", "Code": "200"},{"Name": "C", "Code": "300"}, {"Name": "D", "Code": "400"}];
$objectsToExclude := [{"Name": "A", "Code": "100"} ,{"Name": "B", "Code": "200"},{"Name": "C", "Code": "300"}];
$expectedArray := [{"Name": "D", "Code": "400"}];

所以你可以看到数组中只剩下 D,因为 A、B、C 都存在于两个数组中。

有没有一种干净的方法可以在 JSONAta 中做到这一点?

我能够进行简单的排除,如下所示:

$sourceArray := [1,2,3,4,5];
$removeArray := [3,4,5];

$result := $sourceArray[$not($ in $removeArray)];

我对更复杂的对象执行此操作的尝试失败了。

jsonata
1个回答
0
投票

给定 JSON 输入,例如:

[
  {
    "Name": "A",
    "Code": "100"
  },
  {
    "Name": "B",
    "Code": "200"
  },
  {
    "Name": "C",
    "Code": "300"
  },
  {
    "Name": "D",
    "Code": "400"
  }
]

要根据Code属性排除对象,您可以尝试:

(
  $objectsToExclude := [
    { "Name": "A", "Code": "100" },
    { "Name": "B", "Code": "200" },
    { "Name": "C", "Code": "300" }
  ];

  $expectedArray := $[$not(Code in $objectsToExclude.Code)];
)

游乐场链接:https://jsonatastudio.com/playground/2819d9c1

严格比较对象(逐个属性)是可能的,但它不会很漂亮或有效。如果您愿意的话,我会再考虑一下。

© www.soinside.com 2019 - 2024. All rights reserved.