首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将对象转换为数组reactjs和ramda

将对象转换为数组reactjs和ramda
EN

Stack Overflow用户
提问于 2018-10-06 18:24:04
回答 3查看 2.6K关注 0票数 0

给定以下数据:

代码语言:javascript
运行
复制
    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以及我必须使用哪个函数来在数组中进行转换。

EN

回答 3

Stack Overflow用户

发布于 2018-10-06 19:35:01

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

代码语言: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]];
});

这应该就行了!

票数 0
EN

Stack Overflow用户

发布于 2018-10-07 00:54:27

我不太清楚你想要什么。但这里有两个可能的解决方案,基于我的最佳猜测:

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

从内到外,它的作用如下:R.valuesObject.values非常相似,它接受一个对象,认为它是一个键值对列表,然后返回一个仅包含值的列表。将其传递给R.map并提供products对象,我们将映射到products中的元素,并在每个元素中用对R.values的调用替换它们。最后,R.evolve获取一个规范对象,该对象提供在其每个键上运行的函数,并使用这些函数进行转换和对象。

我的第二个版本是类似的,仍然使用map(values),但使用了一个比Ramda的evolve稍微更标准的工具,称为镜头:

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

镜头可以让你将注意力集中在数据结构的一个部分上,而让其余的部分保持不变。您可以使用R.view访问该属性,使用R.set更改该属性,或者使用R.over调整该属性。有几个函数可以产生镜片。这里我们使用R.lensProp,它将注意力集中在对象的命名属性上。

在函数式编程世界中,镜头是比Ramda更专有的evolve更广泛认可的工具。但它们是为不同的事情而设计的。镜头的目的是聚焦于结构的特定部分,但可以做任何你想做的事情,evolve可以让你调整结构的许多部分,但不像镜头那样提供简单的访问。因为您只想调整单个属性,所以这两种方法都可以在这里工作。

票数 0
EN

Stack Overflow用户

发布于 2019-06-29 23:54:57

简单的版本是:

代码语言:javascript
运行
复制
<div>{R.compose(
  R.values,
  R.map((item: any) => renderYourJsx(item))
 )(this.props.yourData)}</div>

R.values将对象转化为数组,然后使用R.map在数组项上进行映射。您可以将它们都包装在R.compose中,并将您的对象直接传递给compose函数。

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

https://stackoverflow.com/questions/52678061

复制
相关文章

相似问题

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