How to take array of numbers as input in Javascript? [duplicate] - javascript
This question already has answers here:
How to convert a string of numbers to an array of numbers?
(18 answers)
Closed 2 years ago.
"use strict";
let arr = readline().split(" "); // suppose inputs are 1 2 3 4 5
let res=0;
for(let i=0; i<arr.length; i++){
res += arr[i];
}
print(res); // output 012345
I know if I iterate through all the array elements and convert them to Number like arr[index] = Number(arr[index]); then I can get rid from this concatenation and will get pure sum.
But is there any way to convert all of these array elements of Strings to Number directly? without any iteration?
use Array.reduce:
let arr = readline().split(" "); // suppose inputs are 1 2 3 4 5
let res=arr.reduce((acc,e) => +e + acc,0);
"But is there any way to convert all of these array elements of Strings to Number directly?
Computationally, no. That's impossible. Iteration must happen. Otherwise it's like asking how you can visit every person on earth without having to travel.
But if you want to simplify your code by using functional programming then use Array.prototype.map:
const arrayOfInts = readLine().split( ' ' ).map( e => parseInt( e, 10 ) );
Take this further by performing sum with Array.prototype.reduce (also adding a filter to exclude NaN values which would break the summing operation):
I've documented the data-type of each chained function's return value on each line:
const sum = readLine() // string
.split( ' ' ) // string[]
.map( e => parseInt( e, 10 ) ) // ( number | NaN )[]
.filter( n => !isNaN( n ) ) // number[]
.reduce( ( acc, n ) => acc + n ); // number
You can not do it without iterating over it. However, you already loop through the array, so...
Just convert them in the loop where you add them:
"use strict";
let arr = readline().split(" "); // suppose inputs are 1 2 3 4 5
let res=0;
for(let i=0; i<arr.length; i++){
res += Number(arr[i]);
}
print(res); // output 15
Related
Add sum of all numbers in an array and print the final result
please don't kill me right away, because some topics are already here in the forum. I've read and tried a lot. I just don't get any further with my beginner knowledge. My problem is the following: I have 4 arrays, the length of the arrays can have a different length each time. Now I would like to add the sum of all 4 arrays and get a final result. I just can't really get any further than I want. Please bear with me and help me. Here my example : var MyData = '{"M":[{"M":{"MD":995,"PT":1,"TT":17,"D":0,"TID":44,"T":0,"HW":109,"KD":0,"TA":[4,17,77,17010,84,5,6,6,6,5,"xxxx",0,0,128,6,-1,0,34,[],0],"SD":1187,"OD":117,"SA":[1,65,67,194,187,7,8,7,6,6,"yyyy",0,0,-1,-1,-1,0,95,[],0]},"UM":{"PD":0,"TD":0,"L":{"ID":23,"ID":2,"VIS":14,"N":"bbbb","GD":102,"L":17,"W":1429,"D":113,"SPR":9,"Q":[[1647,1,2,5,-1,[[4,40,[114.0]],[5,46,[74.3]],[18,89,[43.6]],[116,34,[42.2]]],-1,-1,0,-1,-1,3,[1,5,3090,[7222,32,5,310,[[312,46,[11.4]],[311,55,[12.8]],[34,72,[19.7]],[30,28,[8.4]]],0]]],[187,2,2,5,-1,[[1,9,[82.4]],[2,86,[86.3]],[112,67,[28.1]],[19,35,[22.0]]],-1,-1,0,-1,-1,3,[2,6,2970,[7127,32,6,3240,[[311,28,[8.5]],[314,67,[18.7]],[32,83,[17.3]],[315,46,[8.0]]],0]]],[14650745,3,2,5,-1,[[3,97,[116.8]],[6,55,[74.8]],[109,42,[24.8]],[116,65,[67.0]]],-1,-1,0,-1,-1,3,[3,6,3590,[77381,32,6,3130,[[313,33,[6.3]],[310,83,[21.1]],[312,61,[13.8]],[311,36,[9.8]]],0]]],[14673,4,2,5,-1,[[7,82,[16.1]],[115,40,[21.0]],[121,87,[215,871.0]],[112,48,[22.4]]],-1,-1,0,-1,-1,3,[4,6,3570,[72077,32,2,2710,[[312,44,[11.0]],[311,52,[12.3]],[313,37,[6.8]],[38,38,[8.8]]],0]]],[14681483230,5,2,0,0,[[21,[5.0]]],1070,-1,0,630006,-1,2],[14649672824,6,2,15,-1,[[808,82,[47.1]],[811,77,[28.1]],[812,50,[20.0]],[815,35,[18.4]],[20018,100,[1.0]],[20016,7,[2060,12.0,2061,12.0,2062,12.0,2063,12.0,2064,12.0,2065,12.0,2066,12.0,2067,12.0,2068,12.0,148,12.0,2069,12.0,149,12.0,2070,12.0,150,12.0,151,12.0,2071,12.0,2072,12.0,2073,12.0,2074,12.0,2075,12.0,2076,12.0,2077,12.0,2078,12.0,2079,12.0,2020,12.0,2021,12.0,2022,12.0,2023,12.0,2024,12.0,2025,12.0,2026,12.0,2027,12.0,2028,12.0,2029,12.0,2030,12.0,2031,12.0,2032,12.0,2033,12.0,2034,12.0,2035,12.0,2036,12.0,2037,12.0,2038,12.0,2039,12.0]]],-1,-1,0,-1,-1,3,[65,6,3440,[]]]],"IDS":[[10021,1023],[10022,1033]],"SIS":[1033,1009,1040,100253],"AE":[[64,[8.0]],[503,[20.0]],[504,[48.0]],[504,[48.0]],[339,[50.0]],[504,[48.0]],[613,[50.0]],[66,[65.0]],[503,[65.0]],[503,[45.0]],[504,[30.0]],[504,[45.0]],[614,[8.0]],[66,[48.0]],[504,[60.0]],[66,[45.0]],[504,[48.0]],[614,[30.0]],[66,[24.0]]]}},"GA":{"L":[[287,30],[216,2224],[215,744],[298,60],[651,76],[650,90],[649,132],[240,50]],"M":[[287,30],[216,2720],[215,3808],[298,60],[651,48],[650,102],[649,125],[648,179],[240,50]],"R":[[287,30],[216,2968],[298,60],[651,76],[650,90],[649,132],[240,50]],"RW":[[215,2358],[216,433]]},"AST":[390,400],"ATT":0,"SM":0}],"O":[{"OID":8344,"DUM":false,"N":"xrr","E":{"BGT":0,"BGC1":14408394,"BGC2":1644825,"SPT":2,"S1":82,"SC1":144394,"S2":82,"SC2":163,"IS":1},"L":7,"LL":50,"H":3195,"AVZ":180,"CF":3911,"HF":16245,"PRE":13,"SUF":23,"TPX":-1,"MP":459,"R":0,"AID":48,"AR":0,"AN":"drum vv","aee":{"CF":237604,"BGT":7,"BGC1":16825,"BGC2":3012,"BGC3":864,"SPT":23,"S1":2,"SC1":30512,"S2":41,"SC2":164825,"S3":0,"SC3":164825},"RPT":0,"AP":[[0,1007,1062,76,1],[0,1170610,1067,757,4],[0,1211752,1056,755,4],[0,100,1059,72,4],[1,163,710,79,12],[2,16771,809,68,12],[3,2052697,772,504,12]],"VP":[],"SA":0,"VF":0,"PF":1,"RRD":0,"TI":-1},{"OD":1187,"DM":false,"N":"xyz","E":{"BGT":1,"BG1":81264,"BG2":5126,"SPT":1,"S1":82,"S1":16425,"S2":82,"S2":164825,"IS":1},"L":7,"LL":90,"H":6738,"AVP":87345,"CF":4591,"HF":5623,"PRE":13,"SUF":27,"TX":1,"P":8828,"R":0,"AD":88,"AR":7,"AN":"DDR ","aee":{"CF":1878,"BT":2,"BC1":14494,"BG2":1894,"BC3":-1,"SPT":0,"S1":-1,"S1":-1,"S2":-1,"SC2":-1,"S3":-1,"SC3":-1},"RPT":0,"AP":[[0,1417194,675,607,1],[0,2086,795,1180,4],[0,3363161,663,603,4],[0,7164676,769,1179,4],[1,489,490,318,12],[2,208,33,71,12],[3,4347,42,108,12],[4,112,818,61,12]],"VP":[],"A":0,"VF":0,"PF":1,"RD":0,"TI":-1,"RP":-1}]}' var MyArray = JSON.parse(MyData) MyArray.M[0].GA.L.forEach(element1 => console.log(element1[1])); MyArray.M[0].GA.M.forEach(element2 => console.log(element2[1])); MyArray.M[0].GA.R.forEach(element3 => console.log(element3[1])); MyArray.M[0].GA.RW.forEach(element4 => console.log(element4[1])); //So I give myself all the values first. //If I then use the for loop on one of the arrays, I get the output: let sum = 0; MyArray.M[0].GA.L.forEach(element1 => { const MyArray = [element1[1]]; for (let i = 0; i < MyArray.length; i++) { sum += MyArray[i]; } console.log(sum); }) //output: 30,2254,2998,3058,3134,3224,3356,3406 The number 3406 is the End Result, how can I print only the End result. If there is another method to add all 4 arrays together at once, it would help me even more. If possible an example for an array and an example for all 4 together please
you have to do three things: consolidate all the arrays, get the sum of all values, then print it first, consolidate const allArrs = [ ...MyArray.M[0].GA.L, ...MyArray.M[0].GA.M, ...MyArray.M[0].GA.R, ...MyArray.M[0].GA.RW ] then, the array method that would help the most here is Array.Reduce const result = allArrs.reduce((accumulator, currentArray) => { accumulator += currentArray[1] return accumulator }, 0) then log the result!
As others have pointed out, this type of problem is very well suited for using a functional programming approach, where you simplify the problem by morphing it into a series of atomic operations that have no side-effects. JavaScript does a great job of implementing the core functional programming methods of map(), filter(), and reduce(). For this problem, the only thing you need is reduce(). The code below could be made smaller and more efficient, but it was written to show each individual step. const data = JSON.parse(rawData); // subData is now an object whose members are the arrays you care about const subData = data.M[0].GA; // turn that into an array of arrays const myArrays = Object.values(subData); // now use reduce() to flatten the array of arrays into a single array with just // the numbers you want to sum const myNums = myArrays.reduce((acc, val) => acc.concat(val[1]), []); // finally, reduce() again to sum the values const sum = myNums.reduce((acc, val) => acc + val, 0); console.log(sum);
You're on the right track. Simply move console.log(sum) outside of the final }) so it's not inside any loops.
I hope I understand what you are trying to do. You can simplify your code in this way. function sum(arr) { return arr.reduce((acc, item) => acc += item[1], 0); } const result = sum(MyArray.M[0].GA.L) + sum(MyArray.M[0].GA.M) + sum(MyArray.M[0].GA.R) + sum(MyArray.M[0].GA.RW);
This is a good example of a use for Array.prototype.reduce. The reduce method loops through all the elements of an array, and uses an accumulator to carry a result through the operation. const someArray = [ /* any number of values */ ] const sum = someArray.reduce( ( acc, val ) => ( acc + val ) You can take this a step further and write the callback as a function expression, and dump all of your arrays into a BIGGER array, and use reduce on THAT ONE too! const summation = ( acc, val ) => ( acc + val ) const sumOfSums = ( acc, val ) => ( acc + val.reduce( summation, 0 ) ) const arrayOfArrays= [ MyArray.M[0].GA.L, MyArray.M[0].GA.M, MyArray.M[0].GA.R MyArray.M[0].GA.RW ] const total = arrayOfArrays.reduce( sumOfSums, 0 ) console.log( `output: ${total}` )
calculate JSON.stringify(obj) to sum value of string? [duplicate]
This question already has answers here: Fastest JavaScript summation (11 answers) Closed 10 months ago. In my local storage I have some score value stored in array var obj = localStorage.getItem("scoreList") output [0,10,10,0,10] I want sum of this value like and return to data value sum = 30 I have tried to convert into string value var string = JSON.stringify(obj); output "[0,10,10,0,10]" How can I execute this sum value ?
[0,10,10,0,10].reduce((sum, a) => sum + a, 0);
localStorage.getItem("scoreList").replace(/(\[|\])/g, '').split(",").map(x => parseFloat(x)).reduce((a,b) => a+b, 0) a simple way: JSON.parse(localStorage.getItem("scoreList")).reduce((x, y) => x + y)
If you set the scoreList value as an array, that is: localStorage.setItem('scoreList', [0,10,10,0,10]) When you get it back it will still be a string, so there's no need for any other kind of validation or data type transformation as you did with JSON.stringfy. The following shoud be enough: const obj = localStorage.getItem("scoreList") const total = obj.reduce((sum, item) => sum + item, 0); //total = 30
better way to count defined elements in sparse array? [duplicate]
This question already has answers here: Javascript array non undefined element count (2 answers) Closed 2 years ago. Consider the following typescript: const myArray: Array<string> = new Array(); myArray[5] = 'hello'; myArray[7] = 'world'; const len = myArray.length; let totalLen = 0; myArray.forEach( arr => totalLen++); console.log('Total elements in the array: ' + len.toString(10)); console.log('Total defined elements in the array: ' + totalLen.toString(10)); Output: Total elements in the array: 8 Total defined elements in the array: 2 I need to insert data into an array at arbitrary indexes, which creates undefined array elements. I then need to check the total number of defined elements in the array. .length includes the undefined elements, but .forEach only iterates over defined elements. It seems like there should be a better way to do this, but I just don't know the right methods.
You can filter the array, and then find the length, like so: myArray.filter(i => i !== undefined).length
You can use for example following myArray.filter(v => v !== undefined).length. There will be sure more solutions for this.
const arrLng = myArray.filter(item=>item !== undefined).length console.log('Total elements in the array: ' + myArray.length ); console.log('Total defined elements in the array: ' + arrLng);
How can I iterate through a keyed array in JavaScript? [duplicate]
This question already has answers here: Getting a list of associative array keys (6 answers) How can I access and process nested objects, arrays, or JSON? (31 answers) Closed 9 years ago. I need to group the rows out of a table that has a matching order number, and then iterate over the groupings. I have this code working which is creating the perfect array, data-wise: var multItems = []; // Combine items under orders, $('tr.order').each(function(){ var orderNum = $(this).find('.ordernumber').val(); if ( ($('tr.order .ordernumber[value="' + orderNum + '"]').length > 1 ) && !(orderNum in multItems) ){ $('tr.order .ordernumber[value="' + orderNum + '"]').each(function(){ if (!(orderNum in multItems)){ multItems[orderNum] = []; } multItems[orderNum].push(this); }); } }); // Create new tr with order totals (of each item) for (var i = multItems.length - 1; i >= 0; i--) { // Code }; But it creates an array with a length of 0, apparently, where multItems = [], but multItems[orderNumber] is defined... just with no way to access it if I don't know the order numbers. I could make an array of the order numbers separately, but that feels like it must be the long way round. If I just create a numbered array, how do I know which number to pop the items from the orders into?
With your current code you have var orderNum = $(this).find('.ordernumber').val(); where val() returns a string and not a number. So when you are doing multItems[orderNum] it is a string. For the current code to work, you want to use a for in loop. for (var prop in multItems) { if( multItems.hasOwnProperty( prop ) ) { console.log(multItems[prop]); } } FYI: Order is not guaranteed. Also you should be using an object {} and not an array here. Now the other thing you can do is to use parseInt to change the string into a number and than magically your for loop would start working. [This is assuming that ordernumber is a numeric value] var orderNum = parseInt($(this).find('.ordernumber').val(), 10);
Sorting an array in javascript: [duplicate]
This question already has answers here: Closed 10 years ago. Possible Duplicate: Sort mixed alpha/numeric array I'm trying to sort an array which contains elements in the form of xxx1, xxx2, xxx3. The Array.sort() method works fine until xxx9 and if there is an element by name xxx10 or xxx11, it fails. The order comes as xxx1, xxx10, xxx11, xxx2 and so on. Please let me know how to fix this.
You are seeing the results of natural string sorting. If string sort is not what you want, you should be using your own comparator. Do something like: arrayToBeSorted.sort(function(first,second) { /* some code that compares 'first' with 'second' and returns <0, ==0, >0*/ });
At the moment your array is being sorted alphabetically which is why you are getting those results. You need to provide your own comparator function to implement a numerical sort. Try var arr = ["xxx1","xxx10","xxx2","xxx20","xxx3","xxx30"]; var sortedArr = arr.sort( function( a, b ) { // remove first 3 characters so remaining string will parse a = parseInt( a.substr( 3 ) ); b = parseInt( b.substr( 3 ) ); return a - b; }); console.log( sortedArr ); // => ["xxx1", "xxx2", "xxx3", "xxx10", "xxx20", "xxx30"]
You can implement custom sorting condition in callback to pass into Array.sort(): var arr = [], re = /^\D*(\d+)$/; for(var i = 20; i-- > 0;) { arr.push('xxx' + i); } function comparator(a, b) { var numA = a.match(re)[1], numB = b.match(re)[1]; return numA - numB; } arr.sort(comparator); console.log(arr); http://jsfiddle.net/f0t0n/qz62J/