将数组转换为具有键/值对的对象

时间:2018-02-27 15:03:58

标签: javascript arrays reactjs object

我还在学习JavaScript,所以如果这似乎是一个补救问题,我会提前道歉。

我正在以数组的形式从API调用接收数据,如下所示:

arr = ['topic1',497,'topic2',591,'topic3',17,'topic4',980]

虽然从该数组中看不出来,但每个主题字符串后面的数字是前一主题的计数。

我想在React应用程序中处理这些数据,即将其映射到表或其他数据结构。但是当这些值是匿名的时候,这非常难以做到。

所以,我想把这个数组转换成一个带键/值对的对象。所以,在工作某种循环/过滤器/地图/等之后。在阵列上,我需要最终得到这个:

newArr = [
  {topic: 'topic1', count: 497},
  {topic: 'topic2', count: 591},
  {topic: 'topic3', count: 17},
  {topic: 'topic4', count: 980},
]

我尝试了很多技巧,包括使用词典,地图,地图,过滤器,forEach,for ... in,以及比我在这一点上记忆更多的技巧。是的,我搜索了许多网页和论坛。问题是,我的问题包括JavaScript的一些基本构建块,所以我找到的答案从来都不足以解决我的问题。

我成功地过滤掉了数组中的偶数和奇数元素,如下所示:

let x = arr.filter((element, index) => {
  return index % 2 === 0; filter elements located at an even index
});

let y = arr.filter((element, index) => {
  return index % 2 === 1; filter elements located at an odd index
});

但我从来没有成功地得到我需要的结果。有人可以帮我指点正确的方向吗?

我使用React,所以请随意提出现代JS技术。谢谢!

3 个答案:

答案 0 :(得分:4)

您需要遍历API响应并从阵列构建对象。

let objectArray = []

for(let i = 0; i < arr.length - 1; i+=2){
    objectArray.push({"topic": arr[i], "count": arr[i+1]})
}

我确信这是一种更简单的方法,但这可以满足您的需求。

在jsFiddle上查看它:https://jsfiddle.net/L6023fn6/1/

答案 1 :(得分:1)

您可以使用version: 1 disable_existing_loggers: true formatters: simple: format: '%(asctime)s - %(name)s - %(levelname)s - %(message)s' handlers: console: class: logging.StreamHandler level: INFO formatter: simple stream: ext://sys.stdout file: class: logging.FileHandler level: DEBUG filename: logs/dbInteract.log loggers: simpleExample: level: DEBUG handlers: [console] propagate: no root: level: DEBUG handlers: [console,file] 来获取数组并发出聚合值,数组,对象或其他内容。完整的实施将是:

array.reduce

如果您愿意使用像const newArr = arr.reduce((fonts, value, index) => { if (0 === index % 2) { fonts.push({ topic: value }); } else { // output array will be half the size of the input hence the / 2 fonts[Math.ceil(index / 2 - 1)].count = value; } return fonts; }, []); 这样的外部库,那么您可以更轻松地实现这一点,因为它会为您打造数组。

lodash

答案 2 :(得分:0)

根据您的问题, arr 是一个字符串,数字...... 模式,按此我觉得您可以这样做。

const arr = ['topic1',497,'topic2',591,'topic3',17,'topic4',980];
const result = [];

for(let i=0; i<arr.length; i+=1) {
 typeof arr[i] === 'string' 
 ?
  result.push({topic: arr[i], count: arr[i+1]})
:
null;

}