使用 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 的作者。
我有一个这样的数组,我正试图从中过滤掉值。
数组是这样的:
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 的作者。