对象内的Javascript过滤器数组

ksa*_*iya 0 javascript reduce object filter

假设我有一个具有结构的对象

data = {
    a : [{values: {key1: 5, key2: "abc"}}, {values: {key1: 3, key2: "abc"}}, {values: {key1: 4, key2: "cde"}}],
    b : [{values: {key1: 3, key2: "ffe"}}, {values: {key1: 11, key2: "gga"}}, {values: {key1: 7, key2: "abc"}}]
}
Run Code Online (Sandbox Code Playgroud)

我想提取元素 where key2 == "abc"

预期输出:

data = {
    a : [{values: {key1: 5, key2: "abc"}}, {values: {key1: 3, key2: "abc"}}],
    b : [{values: {key1: 7, key2: "abc"}}]
}
Run Code Online (Sandbox Code Playgroud)

我试图遵循类似的例子,但未能实现我想要的。

Phi*_*hil 8

使用Object.entries()提取的所有键/值对data作为数组,映射每一对过来,然后filter对每个值,提取你想要的人。

然后你可以加入它备份使用 Object.fromEntries()

const data = {
    a : [{values: {key1: 5, key2: "abc"}}, {values: {key1: 3, key2: "abc"}}, {values: {key1: 4, key2: "cde"}}],
    b : [{values: {key1: 3, key2: "ffe"}}, {values: {key1: 11, key2: "gga"}}, {values: {key1: 7, key2: "abc"}}]
}

const findKey = 'key2'
const findValue = 'abc'

const newData = Object.fromEntries(Object.entries(data).map(([ key, val ]) =>
  [ key, val.filter(({ values }) => values?.[findKey] === findValue) ]))
  
console.log(newData)
Run Code Online (Sandbox Code Playgroud)


如果您还没有看过Optional Chaining,这...

values?.[findKey] === findValue
Run Code Online (Sandbox Code Playgroud)

相当于

!!values && values[findKey] === findValue
Run Code Online (Sandbox Code Playgroud)