[英]Reduce array of objects in javascript
I have an array of objects in javascript that i want to reduce.我在 javascript 中有一个要减少的对象数组。 See code below.
请参阅下面的代码。 message with 6 or more digits is verified, fewer is unverified.
6 位或更多数字的消息已验证,未验证的消息较少。 I group them by group.
我将它们分组。
![]()
const myArray = [ { group: 'groupA', message: 'Text without a number', sl: '1A' }, { group: 'groupA', message: 'Text with a number WO5467829', sl: '1A' }, { group: 'groupB', message: 'Text without a number', sl: '1A' }, { group: 'groupA', message: 'Text with a number WO5467829', sl: '1A' }, { group: 'groupB', message: 'Text with a number WO5467829', sl: '1A' }, { group: 'groupC', message: 'Text without a number', sl: '1B' }, { group: 'groupD', message: 'Text with a number Tick0127866', sl: '1B' }, { group: 'groupC', message: 'Text without a number', sl: '1A' } ]; output = myArray.reduce((acc, line) => { let yes = 0; let no = 0; line.message.match(\/\\d{6,}\/) ? yes++ : no++; acc[line.group] = acc[line.group] || {}; acc[line.group].verified = (acc[line.group].verified || 0) + yes; acc[line.group].unverified = (acc[line.group].unverified || 0) + no; return acc; }, {}); console.log('output', output);<\/code><\/pre>
However I would like the output to also be an array of objects like so:但是我希望输出也是一个对象数组,如下所示:
[ { group: 'groupA', verified: 2, unverified: 1 }, { group: 'groupB', verified: 1, unverified: 1 }, { group: 'groupC', verified: 0, unverified: 2 }, { group: 'groupD', verified: 1, unverified: 0 } ]<\/code><\/pre>
How would I do this?我该怎么做?
"
Use an array as the initial value of your accumulator and inside .reduce<\/code> , use
findIndex<\/code> to check for the current group, if found, update
verified<\/code> and
unverified<\/code> values, otherwise, insert a new one :
使用数组作为累加器的初始值,在
.reduce<\/code>内部,使用
findIndex<\/code>检查当前组,如果找到,更新
verified<\/code>和
unverified<\/code>的值,否则插入新的:
const myArray = [ { group: "groupA", message: "Text without a number", sl: "1A" }, { group: "groupA", message: "Text with a number WO5467829", sl: "1A" }, { group: "groupB", message: "Text without a number", sl: "1A" }, { group: "groupA", message: "Text with a number WO5467829", sl: "1A" }, { group: "groupB", message: "Text with a number WO5467829", sl: "1A" }, { group: "groupC", message: "Text without a number", sl: "1B" }, { group: "groupD", message: "Text with a number Tick0127866", sl: "1B" }, { group: "groupC", message: "Text without a number", sl: "1A" } ]; output = myArray.reduce((acc, line) => { let yes = 0; let no = 0; line.message.match(\/\\d{6,}\/) ? yes++ : no++; \/\/ check if you have the group in the accumulator const ndx = acc.findIndex(e => e.group === line.group); \/\/ if you have it, manipulate verified and unverified if (ndx > -1) { acc[ndx].verified = (acc[ndx].verified || 0) + yes; acc[ndx].unverified = (acc[ndx].unverified || 0) + no; } else { \/\/ insert a new entry instead acc.push({ group: line.group, verified: yes, unverified: no }); } return acc; }, []); \/\/ use an array as the initial value of the accumulator console.log(output);<\/code><\/pre>
"
You can simply extend your solution\/output to get the actual required output using Object.entries()<\/code> or
Object.keys()<\/code> .
您可以使用
Object.entries()<\/code>或
Object.keys()<\/code>简单地扩展您的解决方案\/输出以获得实际所需的输出。
I am going to use
Object.entries()<\/code>
我将使用
Object.entries()<\/code>
const myArray = [ { group: 'groupA', message: 'Text without a number', sl: '1A' }, { group: 'groupA', message: 'Text with a number WO5467829', sl: '1A' }, { group: 'groupB', message: 'Text without a number', sl: '1A' }, { group: 'groupA', message: 'Text with a number WO5467829', sl: '1A' }, { group: 'groupB', message: 'Text with a number WO5467829', sl: '1A' }, { group: 'groupC', message: 'Text without a number', sl: '1B' }, { group: 'groupD', message: 'Text with a number Tick0127866', sl: '1B' }, { group: 'groupC', message: 'Text without a number', sl: '1A' } ]; output = myArray.reduce((acc, line) => { let yes = 0; let no = 0; line.message.match(\/\\d{6,}\/) ? yes++ : no++; acc[line.group] = acc[line.group] || {}; acc[line.group].verified = (acc[line.group].verified || 0) + yes; acc[line.group].unverified = (acc[line.group].unverified || 0) + no; return acc; }, {}); console.log('output', output); const actualOutput = Object.entries(output).map(([group, value]) => ({group, ...value })); console.log(actualOutput);<\/code><\/pre>
"
I couldn't resist refactoring your code a little.我忍不住稍微重构了你的代码。 That said.
那就是说。 what I have done:
我做了什么:
[]<\/code> )
使用数组 ( []<\/code> ) 启动累加器
<\/li>
push a group to the array if it is not yet initialised如果尚未初始化,则将组推送到数组<\/li>
increment verified<\/code> or unverified<\/code> depending whether your test fails
增加verified<\/code>或未unverified<\/code>取决于您的测试是否失败
<\/li><\/ul>
const myArray = [ { group: "groupA", message: "Text without a number", sl: "1A" }, { group: "groupA", message: "Text with a number WO5467829", sl: "1A" }, { group: "groupB", message: "Text without a number", sl: "1A" }, { group: "groupA", message: "Text with a number WO5467829", sl: "1A" }, { group: "groupB", message: "Text with a number WO5467829", sl: "1A" }, { group: "groupC", message: "Text without a number", sl: "1B" }, { group: "groupD", message: "Text with a number Tick0127866", sl: "1B" }, { group: "groupC", message: "Text without a number", sl: "1A" } ]; output = myArray.reduce((acc, line) => { if( acc.findIndex(e => e.group === line.group) === -1 ) { acc.push({ group: line.group, verified: 0, unverified: 0 }); } let group = acc.find(e => e.group === line.group); if( line.message.match(\/\\d{6,}\/) ) group.verified++; else group.unverified++; return acc; }, []); console.log(output);<\/code><\/pre>
"
You can use map()<\/code> on
Object.entries<\/code> .
您可以在
Object.entries<\/code>上使用
map()<\/code> 。
I also refactored your code in
reduce<\/code> method
我还在
reduce<\/code>方法中重构了您的代码
const myArray = [ { group: 'groupA', message: 'Text without a number', sl: '1A' }, { group: 'groupA', message: 'Text with a number WO5467829', sl: '1A' }, { group: 'groupB', message: 'Text without a number', sl: '1A' }, { group: 'groupA', message: 'Text with a number WO5467829', sl: '1A' }, { group: 'groupB', message: 'Text with a number WO5467829', sl: '1A' }, { group: 'groupC', message: 'Text without a number', sl: '1B' }, { group: 'groupD', message: 'Text with a number Tick0127866', sl: '1B' }, { group: 'groupC', message: 'Text without a number', sl: '1A' } ]; let output = myArray.reduce((acc, line) => { acc[line.group] = acc[line.group] || {verified: 0, unverified: 0}; if(line.message.match(\/\\d{6,}\/)){ acc[line.group].verified++ } else{ acc[line.group].unverified++ } return acc; }, {}); output = Object.entries(output).map(([k, v]) => ({group: k, ...v})) console.log('output', output);<\/code><\/pre>
"
Put the group<\/code> prop in your acc.
将
group<\/code>道具放入您的帐户中。
Then use
Object.values<\/code> function to return the values of an object.
然后使用
Object.values<\/code>函数返回对象的值。
const myArray = [ { group: 'groupA', message: 'Text without a number', sl: '1A' }, { group: 'groupA', message: 'Text with a number WO5467829', sl: '1A' }, { group: 'groupB', message: 'Text without a number', sl: '1A' }, { group: 'groupA', message: 'Text with a number WO5467829', sl: '1A' }, { group: 'groupB', message: 'Text with a number WO5467829', sl: '1A' }, { group: 'groupC', message: 'Text without a number', sl: '1B' }, { group: 'groupD', message: 'Text with a number Tick0127866', sl: '1B' }, { group: 'groupC', message: 'Text without a number', sl: '1A' } ]; output = myArray.reduce((acc, line) => { let yes = 0; let no = 0; line.message.match(\/\\d{6,}\/) ? yes++ : no++; acc[line.group] = acc[line.group] || {}; acc[line.group].group = line.group; acc[line.group].verified = (acc[line.group].verified || 0) + yes; acc[line.group].unverified = (acc[line.group].unverified || 0) + no; return acc; }, {}); console.log('output', Object.values(output));<\/code><\/pre>
"
Use reduce in combination with regex testing like this -像这样将 reduce 与正则表达式测试结合使用 -
![]()
const myArray = [{ group: 'groupA', message: 'Text without a number', sl: '1A' }, { group: 'groupA', message: 'Text with a number WO5467829', sl: '1A' }, { group: 'groupB', message: 'Text without a number', sl: '1A' }, { group: 'groupA', message: 'Text with a number WO5467829', sl: '1A' }, { group: 'groupB', message: 'Text with a number WO5467829', sl: '1A' }, { group: 'groupC', message: 'Text without a number', sl: '1B' }, { group: 'groupD', message: 'Text with a number Tick0127866', sl: '1B' }, { group: 'groupC', message: 'Text without a number', sl: '1A' } ]; const numberRegex = \/[0-9]{6}\/; const res = Object.values(myArray.reduce((acc, curr) => { const { group, message } = curr; const isPhoneVerified = numberRegex.test(message); if (!acc[group] && isPhoneVerified) { acc[group] = { group: group, verified: 1, unverified: 0 }; } else if (!acc[group] && !isPhoneVerified) { acc[group] = { group: group, verified: 0, unverified: 1 }; } else if (acc[group] && isPhoneVerified) { acc[group].verified += 1; } else if (acc[group] && !isPhoneVerified) { acc[group].unverified += 1; } return acc; }, {})); console.log(res);<\/code><\/pre>
"
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.