Ramda:通过嵌套键值查找对象键
Ramda: find object key by nested key value
ramda有什么函数可以通过嵌套键值查找键吗?我找到了一种在数组中查找对象的方法,但这无济于事。我需要这样的东西:
const obj = {
addCompany: {
mutationId: '1'
},
addUser: {
mutationId: '2'
},
addCompany: {
mutationId: '3'
}
}
const findByMutationId = R.???
findByMutationId('2', obj) // returns addUser
不确定 ramda,但如果纯 js 中的单行代码对你有好处,那么下面的方法就可以了
const obj = {
addCompany: {
mutationId: '1'
},
addUser: {
mutationId: '2'
}
};
let found = Object.keys(obj).find(e => obj[e].mutationId === '2');
console.log(found);
如果你要使用它,那么你可能需要填充条目,如果你需要键和值,这很好
const obj = {
addCompany: {
mutationId: '1'
},
addUser: {
mutationId: '2'
},
addCompany: {
mutationId: '3'
}
}
let [key, val] = Object.entries(obj).find(obj => obj[1].mutationId == '2')
console.log(key)
console.log(val)
find
结合 propEq
和 keys
应该有效
const obj = {
addCompany: {
mutationId: '1'
},
addUser: {
mutationId: '2'
},
addCompany2: {
mutationId: '3'
}
}
const findByMutationId = id => obj => R.find(
R.o(R.propEq('mutationId', id), R.flip(R.prop)(obj)),
R.keys(obj)
)
console.log(findByMutationId('2')(obj))
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.24.1/ramda.min.js"></script>
Pointfree 版本 lulz
const obj = {
addUser: {
mutationId: '2'
},
addCompany: {
mutationId: '3'
}
}
const findByMutationId = R.compose(
R.o(R.head),
R.o(R.__, R.toPairs),
R.find,
R.o(R.__, R.nth(1)),
R.propEq('mutationId')
)
console.log(findByMutationId('2')(obj))
const findByMutationId2 = R.compose(
R.ap(R.__, R.keys),
R.o(R.find),
R.o(R.__, R.flip(R.prop)),
R.o,
R.propEq('mutationId')
)
console.log(findByMutationId2('3')(obj))
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.24.1/ramda.min.js"></script>
ramda有什么函数可以通过嵌套键值查找键吗?我找到了一种在数组中查找对象的方法,但这无济于事。我需要这样的东西:
const obj = {
addCompany: {
mutationId: '1'
},
addUser: {
mutationId: '2'
},
addCompany: {
mutationId: '3'
}
}
const findByMutationId = R.???
findByMutationId('2', obj) // returns addUser
不确定 ramda,但如果纯 js 中的单行代码对你有好处,那么下面的方法就可以了
const obj = {
addCompany: {
mutationId: '1'
},
addUser: {
mutationId: '2'
}
};
let found = Object.keys(obj).find(e => obj[e].mutationId === '2');
console.log(found);
如果你要使用它,那么你可能需要填充条目,如果你需要键和值,这很好
const obj = {
addCompany: {
mutationId: '1'
},
addUser: {
mutationId: '2'
},
addCompany: {
mutationId: '3'
}
}
let [key, val] = Object.entries(obj).find(obj => obj[1].mutationId == '2')
console.log(key)
console.log(val)
find
结合 propEq
和 keys
应该有效
const obj = {
addCompany: {
mutationId: '1'
},
addUser: {
mutationId: '2'
},
addCompany2: {
mutationId: '3'
}
}
const findByMutationId = id => obj => R.find(
R.o(R.propEq('mutationId', id), R.flip(R.prop)(obj)),
R.keys(obj)
)
console.log(findByMutationId('2')(obj))
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.24.1/ramda.min.js"></script>
Pointfree 版本 lulz
const obj = {
addUser: {
mutationId: '2'
},
addCompany: {
mutationId: '3'
}
}
const findByMutationId = R.compose(
R.o(R.head),
R.o(R.__, R.toPairs),
R.find,
R.o(R.__, R.nth(1)),
R.propEq('mutationId')
)
console.log(findByMutationId('2')(obj))
const findByMutationId2 = R.compose(
R.ap(R.__, R.keys),
R.o(R.find),
R.o(R.__, R.flip(R.prop)),
R.o,
R.propEq('mutationId')
)
console.log(findByMutationId2('3')(obj))
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.24.1/ramda.min.js"></script>