使用 ramda 过滤嵌套对象数组中的值

Filtering values in nested array of objects using ramda

我有一个这样的数组,我正试图从中过滤掉值。

数组是这样的:

const arr = [
  {
    date: "2020-05-18",
    values: [
      { name: "a", value: 1 },
      { name: "b", value: 2 }
    ]
  },
  {
    date: "2020-05-19",
    values: [
      { name: "a", value: 3 },
      { name: "b", value: 8 }
    ]
  },
  {
    date: "2020-05-20",
    values: [
      { name: "a", value: 5 },
      { name: "b", value: 6 }
    ]
  }
]

代码只是一个函数,它将名称作为参数,returns下面的结果。

代码

const result = (name) => {
    //return the below result
}

result("b");  //any name could be passed

结果

[
  { date: "2020-05-18", value: 2 },
  { date: "2020-05-19", value: 2 },
  { date: "2020-05-20", value: 6 }
]

如何在 JS 中实现?如果可以使用 ramda.js

实现输出会更好

谢谢

检查这个code.I希望它对你有帮助

const result = (name) => {
    return arr.map((item)=> {
      var i = item.values.findIndex(el=> el.name == name)
      if(i > -1 ) {
        return { date: item.date , value : item.values[i].value }
      } else {
        return null;
      }
    }).filter(item => item !== null )
}

使用嵌套 for 循环或嵌套 forEach 将达到目标。

下面是嵌套 forEach 的一个示例:

const arr = [
  {
    date: "2020-05-18",
    values: [
      { name: "a", value: 1 },
      { name: "b", value: 2 }
    ]
  },
  {
    date: "2020-05-19",
    values: [
      { name: "a", value: 3 },
      { name: "b", value: 8 }
    ]
  },
  {
    date: "2020-05-20",
    values: [
      { name: "a", value: 5 },
      { name: "b", value: 6 }
    ]
  }
]
function filter(arr, name) {
  let result = []
  arr.forEach(item => item.values.forEach(sub => {
    if (sub.name === name) result.push({'date': item.date, 'value': sub.value})
  }))
  return result
}
console.log(filter(arr, 'b'))

有更简单的 ramda 替代品。

const arr = [
  { date: "2020-05-18", values: [ { name: "a", value: 1 }, { name: "b", value: 2 } ] },
  { date: "2020-05-19", values: [ { name: "a", value: 3 }, { name: "b", value: 8 } ] },
  { date: "2020-05-20", values: [ { name: "a", value: 5 }, { name: "b", value: 6 } ] }
]

const { pipe, fork, map, get } = rubico

const find = f => x => x.find(f)

const main = name => map(fork({
  date: get('date'),
  value: pipe([
    get('values'),
    find(obj => obj.name === name),
    get('value'),
  ]),
}))

console.log(
  main('b')(arr),
)
<script src="https://unpkg.com/rubico"></script>

免责声明:我是 rubico 的作者。

Documentation