将对象转换为数组reactjs和ramda

时间:2018-10-06 10:24:04

标签: javascript node.js reactjs ramda.js

给出以下数据:

    const state = {
        products: {

        newValues: {
          "1": {
            "product_id": 1,
            "name": "Product 1"
          },
          "2": {
            "product_id": 2,
            "name": "Product 2"
          },
        },
        newValuescat:{
          "61": {
            "category_id": 61,
            "name": "category name"
          }
        }
        }
}

我是React和Ramda的新手。如何使用ramda以及我必须使用哪个函数在数组中进行转换。

3 个答案:

答案 0 :(得分:0)

我从这里偷了一些代码: convert Object {} to array [] in javascript

var obj = {"1":5,"2":7,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0}
var result = Object.keys(obj).map(function(key) {
  return [Number(key), obj[key]];
});

这应该做到!

答案 1 :(得分:0)

我不清楚您想要什么。但是,根据我的最佳猜测,这是两种可能的解决方案:

yum update -y
yum install -y epel-release
yum install -y https://s3.amazonaws.com/cloudformation-examples/aws-cfn-bootstrap-latest.amzn1.noarch.rpm
ln -s /usr/local/lib/python2.7/site-packages/cfnbootstrap /usr/lib/python2.7/site-packages/cfnbootstrap
ls /opt/aws/bin/
const makeArrays = R.evolve({products: R.map(R.values)})

const state = {"products": {"newValues": {"1": {"name": "Product 1", "product_id": 1}, "2": {"name": "Product 2", "product_id": 2}}, "newValuescat": {"61": {"category_id": 61, "name": "category name"}}}}

console.log(makeArrays(state))

从内到外,它的作用是:R.values<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.js"></script>几乎相同,它是将一个对象(视为键值对列表)并返回一个Just价值。将其传递给R.map并提供Object.values对象,我们在products中的元素上进行映射,并用每个元素中对products的调用来替换它们。最后,R.evolve接受一个规范对象,该对象提供要在其每个键上运行的功能,并使用这些功能进行转换和对象。


我的第二个版本相似,仍然使用R.values,但使用的标准工具比Ramda的map(values)略多一些,称为镜头:

evolve
const makeArrays = R.over(R.lensProp('products'), R.map(R.values))

const state = {"products": {"newValues": {"1": {"name": "Product 1", "product_id": 1}, "2": {"name": "Product 2", "product_id": 2}}, "newValuescat": {"61": {"category_id": 61, "name": "category name"}}}}

console.log(makeArrays(state))

通过Lens,您可以将注意力集中在数据结构的一部分上,而其余部分则保持不变。您可以使用R.view访问该属性,使用R.set对该属性进行突变,或者使用R.over对其进行调整。产生镜片有几种功能。在这里,我们使用R.lensProp,它将注意力集中在对象的命名属性上。

与Ramda更专有的<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.js"></script>相比,Lens在功能编程世界中是一种更广泛认可的工具。但是它们是为不同的事物而设计的。镜头本应专注于结构的特定部分,但要对其执行任何操作,evolve可让您调整结构的许多部分,但不能像镜头那样简单地进行操作。因为您只想调整一个属性,所以这两种方法都可以在这里使用。

答案 2 :(得分:0)

简单的版本是:

<div>{R.compose(
  R.values,
  R.map((item: any) => renderYourJsx(item))
 )(this.props.yourData)}</div>

R.values将对象转换为数组,然后使用R.map映射数组项。您可以将两者都包装在R.compose中,然后将对象直接传递给compose函数。