Ramda:将重复数组转换为对象

Ramda : convert duplicate arrays to objects

使用 ramda 转换其中包含重复项的对象数组

    var testData = [
    {"id" : "001",
        "project" : "one",
        "projectstartDate" : "10/12/2018"
    },{"id" : "001",
        "project" : "two",
        "projectstartDate" : "10/14/2018"
    },{"id"  : "002",
        "project" : "one",
        "projectstartDate" : "10/12/2018"
    },{"id"  : "002",
        "project" : "two",
        "projectstartDate" : "10/14/2018"
    }
]

需要输出为

{
"001" : {
    "one" : {
        "projectstartDate" : "10/12/2018"
    },
    "two" : {
        "projectstartDate" : "10/14/2018"
    }
},
"002" :{
    "one" : {
        "projectstartDate" : "10/12/2018"
    },
    "two" : {
        "projectstartDate" : "10/14/2018"
    }
}

正在创建以 id 作为键的对象并删除重复项

让我们把它分成几个步骤。

首先,当你有一个列表,你想通过某些功能将它们组合在一起时,像 R.groupBy can be helpful. In this particular instance you want to group by the id property, so R.prop('id') 这样的东西可以用作给 R.groupBy 的函数。

const testData = [
    {"id" : "001",
        "project" : "one",
        "projectstartDate" : "10/12/2018"
    },{"id" : "001",
        "project" : "two",
        "projectstartDate" : "10/14/2018"
    },{"id"  : "002",
        "project" : "one",
        "projectstartDate" : "10/12/2018"
    },{"id"  : "002",
        "project" : "two",
        "projectstartDate" : "10/14/2018"
    }
]

console.log(R.groupBy(R.prop('id'), testData))
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.min.js"></script>

一旦你对这些进行了分组,你想转换一个由某个值索引的对象中的列表,这通常是实现 R.indexBy 的好时机。因为我们想要索引与每个分组对象的键关联的每个列表,所以我们需要 R.map 对象。

const testData = {
  "001": [
    {
      "id": "001",
      "project": "one",
      "projectstartDate": "10/12/2018"
    },
    {
      "id": "001",
      "project": "two",
      "projectstartDate": "10/14/2018"
    }
  ],
  "002": [
    {
      "id": "002",
      "project": "one",
      "projectstartDate": "10/12/2018"
    },
    {
      "id": "002",
      "project": "two",
      "projectstartDate": "10/14/2018"
    }
  ]
}

console.log(
  R.map(R.indexBy(R.prop('project')), testData)
)
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.min.js"></script>

然后我们必须清理嵌套对象中遗留的剩余属性。您在这里有几个选择,即通过使用 R.omit or which properties you want to keep with R.pick.

声明要删除的属性

const testData = {
  "id" : "001",
  "project" : "one",
  "projectstartDate" : "10/12/2018"
}

console.log(
  R.pick(['projectstartDate'], testData)
)
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.min.js"></script>

现在剩下的就是使用 R.pipe and R.map.

通过管道将它们连接在一起

const testData = [
    {"id" : "001",
        "project" : "one",
        "projectstartDate" : "10/12/2018"
    },{"id" : "001",
        "project" : "two",
        "projectstartDate" : "10/14/2018"
    },{"id"  : "002",
        "project" : "one",
        "projectstartDate" : "10/12/2018"
    },{"id"  : "002",
        "project" : "two",
        "projectstartDate" : "10/14/2018"
    }
]

const fn = R.pipe(
  R.groupBy(R.prop('id')),
  R.map(R.pipe(
      R.indexBy(R.prop('project')),
      R.map(R.pick(['projectstartDate']))
  ))
)

console.log(
  fn(testData)
)
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.min.js"></script>