let obj = {
tom: {
id: 0
},
david: {
id: 1
},
john: {
id: 2
}
}
let ids = [1, 2]我想根据ids过滤obj。
我想要的结果是
{ david:{ id: 1 },john:{ id: 2}}
因为上面的ids是1,2。
我想用Ramda.js来做这个。
请帮帮我。
好吧,对不起。
我做了这样的事。
let obj2 = {}
ids.forEach((x) => {
obj2 += R.filter(y => y.id === x, obj)
})
obj = obj2但是,这是不正确的。
我不想使用forEach。
我想用Ramda.js来做。
发布于 2019-03-08 04:10:06
您可以只使用Javascript来完成这个任务,首先可以使用要保留的ids创建一个集(检查set是否有一个元素是O(1))。然后,您可以在原始object上循环,并在一个新的object上添加带有value的key (如果该集合具有相关的id )。
let obj = {
tom: {id: 0},
david: {id: 1},
john: {id: 2}
}
let ids = [1, 2];
const filterByIds = (obj, ids) =>
{
let idsSet = new Set(ids);
let filteredObj = {};
for (k in obj)
{
if (idsSet.has(obj[k].id))
filteredObj[k] = obj[k];
}
return filteredObj;
}
console.log(filterByIds(obj, ids));.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}
更新使用Ramda:
有了兰达,你可以这样做:
let obj = {
tom: {id: 0},
david: {id: 1},
john: {id: 2}
}
let ids = [1, 2];
let idsSet = new Set(ids);
const hasValidId = o => idsSet.has(o.id);
let res = R.filter(hasValidId, obj);
console.log(res);.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.min.js"></script>
如果您阅读了文档这里,那么很容易
发布于 2019-03-08 04:03:39
您可以在纯JavaScript中使用Object.entries并使用includes进行析构,如下所示:
let obj = {
tom: {
id: 0
},
david: {
id: 1
},
john: {
id: 2
}
};
let ids = [1, 2];
let result = {};
Object.entries(obj).forEach(([name, { id }]) => {
if (ids.includes(id)) {
result[name] = { id: id };
}
});
console.log(result);
发布于 2019-03-08 06:53:54
一般来说,您应该努力使用帮助您的数据结构,而不是针对您的数据结构。
有一个简化的数据结构,如下所示:
const obj = [
{id: 0, name: 'tom'},
{id: 1, name: 'david'},
{id: 2, name: 'john'}
]你可以用innerJoin
innerJoin((cur, id) => cur.id === id, obj, [1, 2])如何将原始数据结构转换为简化的数据结构?
对Ramda来说,这可以是一个两步的过程:
toPairs将对象拆分为一个键/值对数组:
{tom:{id: 0} ~> ['tom',{id: 0}]
const obj = {
tom: {
id: 0
},
david: {
id: 1
},
john: {
id: 2
}
}
const convert = R.compose(R.map(([name, id]) => ({name, ...id})), R.toPairs);
console.log(convert(obj))<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.min.js"></script>
https://stackoverflow.com/questions/55056489
复制相似问题