ES6有没有一种快捷方式来比较元素数组和对象键并删除不匹配的元素?

BAT*_*008 2 javascript arrays json object ecmascript-6

我正在尝试找到可以激活以下内容的快捷方式或单行代码:

我有一个selectedFields由元素组成的数组:

selectedFields = [ "time", "age", "city" ]
Run Code Online (Sandbox Code Playgroud)

我有一个valueProvided由值组成的对象:

valueProvided = { "time": "2022-10-01", "visa": "onArrival", "age": 30, "city": "paris", "hotel": "Holiday" }
Run Code Online (Sandbox Code Playgroud)

我想比较这两个字段并从中删除valueProvided object数组中不可用的任何元素。意思是在这种情况下元素visahotel不存在于其中selectedFields,所以我想从中删除它,valueProvided这样我的最终结果将如下所示:

result = { "time": "2022-10-01",  "age": 30, "city": "paris" }
Run Code Online (Sandbox Code Playgroud)

我知道我可以循环遍历数组中的元素并从对象中删除不匹配的键来实现此目的,但我试图找到是否有任何快捷方式或 ES6 方法可以在单行中或有效地执行此操作。

我找到了几个答案,但在所有情况下,他们都试图将对象与另一个对象或数组与另一个数组进行比较,而不是使用交叉方法将数组与对象进行比较,反之亦然。

Nic*_*ick 6

您可以使用Object.entries从 中获取条目valueProvidedfilter根据键是否在 中获取条目selectedFields,然后使用Object.fromEntries来构建结果对象:

const selectedFields = ["time", "age", "city"]

const valueProvided = {
  "time": "2022-10-01",
  "visa": "onArrival",
  "age": 30,
  "city": "paris",
  "hotel": "Holiday"
}

const result = Object.fromEntries(
  Object.entries(valueProvided).filter(([k, v]) => selectedFields.includes(k))
)

console.log(result)
Run Code Online (Sandbox Code Playgroud)

正如 @NickParsons 在评论中指出的,您可以通过从in 的键到来自 的键值对创建一个对象来进一步优化这一点(只要 中的所有键都selectedFields存在valueProvided):mappingselectedFieldsvalueProvided

const selectedFields = ["time", "age", "city"]

const valueProvided = {
  "time": "2022-10-01",
  "visa": "onArrival",
  "age": 30,
  "city": "paris",
  "hotel": "Holiday"
}

const result = Object.fromEntries(
  selectedFields.map(k => [k, valueProvided[k]])
)

console.log(result)
Run Code Online (Sandbox Code Playgroud)

如果valueProvided是一个数组,您需要使用以下方式迭代它map

const selectedFields = ["time", "age", "city"]

const valueProvided = [{
    "time": "2022-10-01",
    "visa": "onArrival",
    "age": 30,
    "city": "paris",
    "hotel": "Holiday"
  },
  {
    "time": "2022-11-12",
    "visa": "preBooked",
    "age": 45,
    "city": "london",
    "hotel": "Business"
  }
]

const result = valueProvided.map(v => Object.fromEntries(
  Object.entries(v).filter(([k, v]) => selectedFields.includes(k))
  // or
  // selectedFields.map(k => [k, v[k]])
))

console.log(result)
Run Code Online (Sandbox Code Playgroud)