简体   繁体   English

"减少javascript中的对象数组"

[英]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:我做了什么:

  • initiate the accumulator with an array ( []<\/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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM