在.forEach()中将数组转换为单个值

时间:2018-05-02 16:25:43

标签: javascript arrays

处理从五个不同数据库中获取查询的数据转换项目,并将它们合并在一起。 (有两个记录集彼此非常相似,另外两个记录集彼此相似。)

五个回复记录中有三个没问题。其他两个(相似的)奇怪地将某些字段作为数组而不是单个值返回。

即:

dbRecords = [
   {
        FirstName: ['john', 'john doe']
    }
]

这肯定是由于数据维护不佳,但我想将这些转换为单个值,我想我可以这样做。

dbRecords.forEach((item, index, arr) => {
    Object.keys(item).forEach(i => {
        if(i instanceof Array){
            item = item[0];
        }
    }
});

那可以解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

  

那可以解决这个问题吗?

不,原因item是对象而不是您想要更改的值,您必须这样做:

 item[i] = item[i][0];

另外,i始终是string,而且Array检查必须是 if(item[i] instanceof Array){

i

然后你必须将它存回数据库。

PS:key是一个糟糕的变量名称,为什么不采用{{1}}或类似的东西?

答案 1 :(得分:0)

  

"五个返回的记录中有三个没问题。其他两个(相似的)奇怪地将某些字段作为数组而不是单个值返回。"

从这个陈述中,听起来你确切地知道哪两个字段是意外的数组。在这种情况下,你不应该使用循环,而是直接定位这些字段。

假设字段为FirstNameLastName,您可以这样做:

dbRecords = dbRecords.map(({FirstName:[FirstName], LastName:[LastName], ...rest}) => 
  ({FirstName, LastName, ...rest})
);

这利用了参数解构和" rest sytnax"在对象文字中,将第一个数组成员提取您感兴趣的两个字段,以及将其余字段提取到一个单独的对象中,然后返回一个新对象,其中包含提取的值以及其余字段。

这是一个有效的例子:



let dbRecords = [{
   FirstName: ['john', 'john doe'],
   LastName: ['doe', 'john doe'],
   OtherField: "foobar"
}, {
   FirstName: ['bob', 'bob smith'],
   LastName: ['smith', 'bob smith'],
   OtherField: "raboof"
}];

dbRecords = dbRecords.map(({FirstName:[FirstName], LastName:[LastName], ...rest}) => 
  ({FirstName, LastName, ...rest})
);

console.log(dbRecords);