首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于Ramda.js数组的对象筛选

基于Ramda.js数组的对象筛选
EN

Stack Overflow用户
提问于 2019-03-08 03:55:46
回答 5查看 376关注 0票数 0
代码语言:javascript
复制
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来做这个。

请帮帮我。

好吧,对不起。

我做了这样的事。

代码语言:javascript
复制
let obj2 = {}
ids.forEach((x) => {
      obj2 += R.filter(y => y.id === x, obj)
      })
obj = obj2

但是,这是不正确的。

我不想使用forEach。

我想用Ramda.js来做。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2019-03-08 04:10:06

您可以只使用Javascript来完成这个任务,首先可以使用要保留的ids创建一个集(检查set是否有一个元素是O(1))。然后,您可以在原始object上循环,并在一个新的object上添加带有valuekey (如果该集合具有相关的id )。

代码语言:javascript
复制
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));
代码语言:javascript
复制
.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}

更新使用Ramda:

有了兰达,你可以这样做:

代码语言:javascript
复制
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);
代码语言:javascript
复制
.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}
代码语言:javascript
复制
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.min.js"></script>

如果您阅读了文档这里,那么很容易

票数 2
EN

Stack Overflow用户

发布于 2019-03-08 04:03:39

您可以在纯JavaScript中使用Object.entries并使用includes进行析构,如下所示:

代码语言:javascript
复制
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);

票数 1
EN

Stack Overflow用户

发布于 2019-03-08 06:53:54

一般来说,您应该努力使用帮助您的数据结构,而不是针对您的数据结构。

有一个简化的数据结构,如下所示:

代码语言:javascript
复制
const obj = [
  {id: 0, name: 'tom'},
  {id: 1, name: 'david'},
  {id: 2, name: 'john'}
]

你可以用innerJoin

代码语言:javascript
复制
innerJoin((cur, id) => cur.id === id, obj, [1, 2])

如何将原始数据结构转换为简化的数据结构?

对Ramda来说,这可以是一个两步的过程:

  1. 使用toPairs将对象拆分为一个键/值对数组: {tom:{id: 0} ~> ['tom',{id: 0}]
  2. 将每一对映射为一个对象: ['tom',{id: 0}] ~> {name:'tom',id: 0}

代码语言:javascript
复制
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))
代码语言:javascript
复制
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.min.js"></script>

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55056489

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档