我还在学习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技术。谢谢!
答案 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;
}