javascript - Lodash:过滤然后映射到一个对象

标签 javascript reactjs redux lodash

我试图用 delete: false 过滤掉对象,然后只将这些对象映射和渲染到屏幕上,但我不确定如何让它工作。

示例对象

{
  "8xf0y6ziyjabvozdd253nd": {
    "id": "8xf0y6ziyjabvozdd253nd",
    "timestamp": 1467166872634,
    "title": "Udacity is the best place to learn React",
    "body": "Everyone says so after all.",
    "author": "thingtwo",
    "category": "react",
    "voteScore": 6,
    "deleted": false
  }
}

key和map的查找方法。

const {posts} = this.props
        return _.find(posts, { 'deleted': false })_.map(posts, post => {
            return (
                <div key={post.id}>

最佳答案

基本上可以申请lodash#reduce直接到 Object 而不是先获取所有的键,然后再迭代。使用 reduce,您可以同时进行映射和过滤

_.reduce(obj, (i, v, k)=> !v.deleted && !(i[k] = v) || i, {});

让我们为您创建一个工作示例,这是一个代码片段:

var obj = {
  "9ny0z4ziyjabvozdc713dr": {
    "id": "9ny0z4ziyjabvozdc713dr",
    "timestamp": 1467166879723,
    "title": "StackOverfow is the best place to learn Angular",
    "body": "bla bla bla bla.",
    "author": "myself",
    "category": "angular",
    "voteScore": 9,
    "deleted": true
  },
    "8xf0y6ziyjabvozdd253nd": {
    "id": "8xf0y6ziyjabvozdd253nd",
    "timestamp": 1467166872634,
    "title": "Udacity is the best place to learn React",
    "body": "Everyone says so after all.",
    "author": "thingtwo",
    "category": "react",
    "voteScore": 6,
    "deleted": false
  }
}

var finalObj =_.reduce(obj, (i, v, k)=> !v.deleted && !(i[k] = v) || i, {});

console.log(finalObj);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.js"></script>

编辑

对于特定情况(OP),只需要删除一些键/值对并构造一个新对象,然后最好使用 lodash#omitBy在某些情况下简单地从对象中删除一些条目。这是此特定用途的一个简单示例。

_.omitBy(obj, o=>o.deleted);

下面是这个例子的代码片段:

var obj = {
      "9ny0z4ziyjabvozdc713dr": {
        "id": "9ny0z4ziyjabvozdc713dr",
        "timestamp": 1467166879723,
        "title": "StackOverfow is the best place to learn Angular",
        "body": "bla bla bla bla.",
        "author": "myself",
        "category": "angular",
        "voteScore": 9,
        "deleted": true
      },
        "8xf0y6ziyjabvozdd253nd": {
        "id": "8xf0y6ziyjabvozdd253nd",
        "timestamp": 1467166872634,
        "title": "Udacity is the best place to learn React",
        "body": "Everyone says so after all.",
        "author": "thingtwo",
        "category": "react",
        "voteScore": 6,
        "deleted": false
      }
    }

    var finalObj =_.omitBy(obj, o=>o.deleted);

    console.log(finalObj);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.js"></script>

但是,如果两者之间需要任何转换(数组或对象),或者需要自定义输出类型,那么我仍然更愿意建议使用 reduce。

关于javascript - Lodash:过滤然后映射到一个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46228559/

相关文章:

javascript - 将 vtype 添加到网格 EXT-JS 中的列

javascript - 为什么这个 do/while 循环会崩溃?

ruby-on-rails - Rails 主动存储 : Get relative disk service path for attachment

javascript - 无法使用 ChakraUI 中的 useDisclosure() 在同一页面上使用两个模态

javascript - 从 Redux 中的多个位置在中间件中添加 reducer

reactjs - 构造函数中的 setState 无法正常工作 : ReactJS

javascript - 获取请求失败,错误为 : connect ECONNREFUSED

javascript - 将随机生成的绝对 div 定位为网格的最佳方法?

reactjs - 使用 React 延迟加载模块?

angular - 从 Angular 服务通过管道传输时,rxjs catchError 不起作用