CopyPastor

Detecting plagiarism made easy.

Score: 1.8102861046791077; Reported for: String similarity, Exact paragraph match Open both answers

Possible Plagiarism

Plagiarized on 2022-04-10
by Антон

Original Post

Original - Posted on 2022-04-04
by Luiz Avila



            
Present in both answers; Present only in the new answer; Present only in the old answer;

# Option 1 You can loop over your object one more time and insert the percentage. It is not the best solution performance-wise, but it's simpler.

<!-- begin snippet: js hide: false console: true babel: null -->
<!-- language: lang-js -->
const ob = { "dataOne": [ { "type": "Type 1", "name": "failed" }, { "type": "Type 1", "name": "success" }, { "type": "Type 2", "name": "success" }, { "type": "Type 3", "name": "success" }, ], "dataTwo": [ { "type": "Type 1", "name": "click", }, { "type": "Type 2", "name": "click", }, { "type": "Type 2", "name": "click", }, { "type": "Type 1", "name": "click", }, { "type": "Type 3", "name": "click", }, ] };
const dataOneReduced = ob.dataOne.reduce((acc, o) => { if (!acc[o.type]) { acc[o.type] = [ { count: 0, success: 0, failed: 0, click: 0, }, ]; }
acc[o.type][0]["count"] = (acc[o.type][0]["count"] || 0) + 1; acc[o.type][0][o.name] = acc[o.type][0][o.name] + 1;
return acc; }, {});
const result = ob.dataTwo.reduce((acc, o) => { acc[o.type][0][o.name] = acc[o.type][0][o.name] + 1;
return acc; }, dataOneReduced);
for (const type of Object.keys(result)) { const obj = result[type][0]; obj.successPercentage = obj.success / obj.count * 100; }
console.log(result);
<!-- end snippet -->
# Option 2
You can insert the calculation directly into `.reduce()`, and it will work fine because only the value will be overwritten with each iteration, and only the last, correct value will be in the output.
<!-- begin snippet: js hide: false console: true babel: null -->
<!-- language: lang-js -->
const ob = { "dataOne": [ { "type": "Type 1", "name": "failed" }, { "type": "Type 1", "name": "success" }, { "type": "Type 2", "name": "success" }, { "type": "Type 3", "name": "success" }, ], "dataTwo": [ { "type": "Type 1", "name": "click", }, { "type": "Type 2", "name": "click", }, { "type": "Type 2", "name": "click", }, { "type": "Type 1", "name": "click", }, { "type": "Type 3", "name": "click", }, ] };
const dataOneReduced = ob.dataOne.reduce((acc, o) => { if (!acc[o.type]) { acc[o.type] = [ { count: 0, success: 0, failed: 0, click: 0, }, ]; }
acc[o.type][0]["count"] = (acc[o.type][0]["count"] || 0) + 1; acc[o.type][0][o.name] = acc[o.type][0][o.name] + 1; acc[o.type][0].successPercentage = acc[o.type][0].success / acc[o.type][0].count * 100;
return acc; }, {});
const result = ob.dataTwo.reduce((acc, o) => { acc[o.type][0][o.name] = acc[o.type][0][o.name] + 1;
return acc; }, dataOneReduced);
console.log(result);
<!-- end snippet -->
I think is easier to concat the two datasets first and then reduce. Here is my code for this:
<!-- begin snippet: js hide: false console: true babel: false -->
<!-- language: lang-js -->
const ob = { "dataOne": [ { "type": "Type 1", "name": "failed" }, { "type": "Type 1", "name": "success" }, { "type": "Type 2", "name": "success" }, { "type": "Type 3", "name": "success" }, ], "dataTwo": [ { "type": "Type 1", "name": "click", }, { "type": "Type 2", "name": "click", }, { "type": "Type 2", "name": "click", }, { "type": "Type 1", "name": "click", }, { "type": "Type 3", "name": "click", }, ] };
const concatenatedArrays = ob.dataOne.concat(ob.dataTwo);
const result = concatenatedArrays.reduce((acc, o) => { if (!acc[o.type]) { acc[o.type] = [{ "count": 0, "success": 0, "failed": 0, "click": 0, }]; } if(o.name == "failed" || o.name == "success"){ acc[o.type][0]['count'] = (acc[o.type][0]['count'] || 0) + 1;
}
acc[o.type][0][o.name] = acc[o.type][0][o.name] +1
return acc; }, {});
console.log(result);
<!-- end snippet -->
**EDIT:**
Hmm so the count is just for dataOne, changing the code and using reduce twice:
<!-- begin snippet: js hide: false console: true babel: false -->
<!-- language: lang-js -->
const ob = { "dataOne": [ { "type": "Type 1", "name": "failed" }, { "type": "Type 1", "name": "success" }, { "type": "Type 2", "name": "success" }, { "type": "Type 3", "name": "success" }, ], "dataTwo": [ { "type": "Type 1", "name": "click", }, { "type": "Type 2", "name": "click", }, { "type": "Type 2", "name": "click", }, { "type": "Type 1", "name": "click", }, { "type": "Type 3", "name": "click", }, ] };
const dataOneReduced = ob.dataOne.reduce((acc, o) => { if (!acc[o.type]) { acc[o.type] = [ { count: 0, success: 0, failed: 0, click: 0, }, ]; }
acc[o.type][0]["count"] = (acc[o.type][0]["count"] || 0) + 1; acc[o.type][0][o.name] = acc[o.type][0][o.name] + 1;
return acc; }, {});
const result = ob.dataTwo.reduce((acc, o) => { acc[o.type][0][o.name] = acc[o.type][0][o.name] + 1;
return acc; }, dataOneReduced);
console.log(result);
<!-- end snippet -->


        
Present in both answers; Present only in the new answer; Present only in the old answer;