JavaScript లో Arrays & Array Methods
మీ క్లాస్ లో 50 మంది విద్యార్థుల మార్కులను store చేయాలనుకోండి. 50 వేర్వేరు variables తయారు చేస్తారా? mark1, mark2, mark3 ... mark50? అది రాయడం చాలా కష్టం, పైగా వాటన్నిటి సగటు (average) తీయడం ఇంకా కష్టం!
దీనికి అద్భుతమైన పరిష్కారం Array. Array అంటే ఒకే చోట చాలా విలువలను వరుసగా నిల్వ చేసే లిస్ట్. ఒక పుస్తకాల అరలో (bookshelf) పుస్తకాలను వరుసగా పేర్చినట్లు: ప్రతి దానికి ఒక స్థానం (నంబర్/index) ఉంటుంది. ఒక్క పేరుతో (marks) మొత్తం 50 మార్కులనూ దాచుకోవచ్చు.
ఈ సమగ్ర పేజీలో మనం రెండు ముఖ్యమైన భాగాలు నేర్చుకుంటాం: Part A లో Arrays బేసిక్స్ (నిర్మించడం, యాక్సెస్ చేయడం, మార్చడం, loops, 2D arrays). Part B లో ఆధునిక ప్రాజెక్ట్లు మరియు జాబ్ ఇంటర్వ్యూలలో అత్యంత ప్రాధాన్యత కలిగిన శక్తివంతమైన Array Methods (map, filter, reduce, sort మొదలైనవి).
Array ని చతురస్ర బ్రాకెట్లు [ ] లో, విలువలను కామాలతో వేరు చేసి (comma-separated) రాస్తాం.
const fruits = ["Apple", "Banana", "Mango"];
console.log(fruits);
console.log(fruits.length);
[ 'Apple', 'Banana', 'Mango' ]
3
fruitsఅనేది array పేరు. లోపల 3 విలువలు (elements) ఉన్నాయి..lengthఅనే property array లో మొత్తం ఎన్ని elements ఉన్నాయో ఖచ్చితంగా చెబుతుంది.
ఏ రకం విలువలైనా పెట్టొచ్చు (Mixed Data Types)
JavaScript arrays చాలా సరళమైనవి (flexible). Array లో numbers, strings, booleans, null, ఇంకా వేరే arrays కూడా పెట్టొచ్చు. ఒకే array లో వేర్వేరు రకాల డేటాను కలిపి కూడా ఉంచవచ్చు (కానీ నిజ జీవితంలో క్లీన్ కోడ్ కోసం ఒకే రకం డేటాను పెడతాం).
const mixed = ["రవి", 25, true, null];
const empty = [];
console.log(mixed);
console.log(empty, empty.length);
[ 'రవి', 25, true, null ]
[] 0
[] అనేది ఖాళీ array (empty array). మొదట ఖాళీ array ని తయారుచేసి, ప్రోగ్రామ్ రన్ అవుతున్నప్పుడు డేటాను దాచుకోవడానికి ఇది బాగా ఉపయోగపడుతుంది.
Array అంటే ఏ డేటా రకం? (Type of Array)
const fruits = ["Apple", "Banana", "Mango"];
console.log(typeof fruits, Array.isArray(fruits));
object true
typeof ఆపరేటర్ array ని కూడా "object" అనే చెబుతుంది (Chapter 4 లో typeof null === "object" లాగా ఇది JavaScript లో ఒక చారిత్రక విచిత్రం). కాబట్టి ఒక variable నిజంగా array అవునా కాదా ఖచ్చితంగా నిర్ధారించుకోవడానికి ఎప్పుడూ Array.isArray(variable) వాడాలి!
Array లోని ప్రతి విలువకు ఒక index (స్థాన సంఖ్య) ఉంటుంది. కంప్యూటర్ సైన్స్ లో అతి ముఖ్యమైన నియమం: ఇండెక్స్ ఎప్పుడూ 0 నుంచి మొదలవుతుంది, 1 నుంచి కాదు!
| ఇండెక్స్ (Index) | 0 | 1 | 2 |
|---|---|---|---|
| విలువ (Element) | "Apple" |
"Banana" |
"Mango" |
రైలు పెట్టెలకు (train compartments) 0 నుంచి నంబర్లు వేసినట్లు ఊహించుకోండి. మొదటి విలువ index 0 లో, రెండోది index 1 లో, మూడోది index 2 లో ఉంటుంది.
const fruits = ["Apple", "Banana", "Mango"];
console.log(fruits[0], fruits[2], fruits[3]);
Apple Mango undefined
fruits[0]→ మొదటి విలువ"Apple".fruits[2]→ మూడో విలువ"Mango".fruits[3]→ అలాంటి స్థానమే లేదు (ఎందుకంటే ఉన్నవే 3 elements, వాటి ఇండెక్సులు 0, 1, 2). కాబట్టి JavaScript లో ఎర్రర్ రాకుండాundefinedవస్తుంది.
చివరి విలువను తీసుకోవడం (Last Element)
Array లో చివరి index ఎప్పుడూ length - 1 అవుతుంది (3 elements ఉంటే చివరి index 2).
const fruits = ["Apple", "Banana", "Mango"];
console.log(fruits[fruits.length - 1]);
console.log(fruits.at(-1));
Mango
Mango
.at(-1) అనేది ఆధునిక (ES2022+) చిన్న పద్ధతి: ఋణ సంఖ్య (negative index) ఇస్తే చివరి నుంచి లెక్కిస్తుంది (-1 చివరిది, -2 చివరి నుంచి రెండోది). పాత బ్రౌజర్లను దృష్టిలో పెట్టుకున్నప్పుడు arr[arr.length - 1] పద్ధతి కూడా తెలుసుకోవడం ఉత్తమం.
ఇండెక్స్ ద్వారా ఒక స్థానంలోని విలువను నేరుగా కొత్త విలువతో రీప్లేస్ చేయవచ్చు.
const fruits = ["Apple", "Banana", "Mango"];
fruits[1] = "Orange";
console.log(fruits);
[ 'Apple', 'Orange', 'Mango' ]
const తో పెట్టిన Array ని మార్చవచ్చా?
అవును, ఖచ్చితంగా మార్చవచ్చు! చాలా మంది బిగినర్స్ const ఉంది కదా, లోపలి విలువలు ఎలా మారతాయి అని అయోమయానికి గురవుతారు. const అంటే "ఈ వేరియబుల్ కి వేరే సరికొత్త array అడ్రస్ ని అసైన్ చేయలేం" అని మాత్రమే అర్థం. కానీ array లోపలి బాక్సుల్లోని విలువలను సులభంగా మార్చుకోవచ్చు.
const f2 = ["a"];
f2 = []; // ❌ Error! Reassignment not allowed
TypeError: Assignment to constant variable.
కొత్త array ని f2 = [] అని ఇవ్వలేం. కానీ f2[0] = "b" లేదా f2.push("c") చేయడం 100% చెల్లుబాటు అవుతుంది.
Array చివరన లేదా మొదట్లో elements ని చేర్చడానికి, తీసేయడానికి 4 ప్రధాన మెథడ్స్ ఉన్నాయి. వీటిని సినిమా టికెట్ క్యూ లైన్ లో నిల్చున్న వ్యక్తుల్లా ఊహించుకోండి:
| Method | పని (Operation) | ఎక్కడ జరుగుతుంది? |
|---|---|---|
push(x) |
చివర్లో కొత్త element ని చేర్చుతుంది | క్యూ వరుస చివర (End) |
pop() |
చివరి element ని తొలగిస్తుంది | క్యూ వరుస చివర (End) |
unshift(x) |
మొదట్లో కొత్త element ని చేర్చుతుంది | క్యూ వరుస మొదట (Start) |
shift() |
మొదటి element ని తొలగిస్తుంది | క్యూ వరుస మొదట (Start) |
const nums = [10, 20, 30];
console.log(nums.push(40)); // 40 ని చివర చేర్చింది
console.log(nums);
console.log(nums.pop()); // చివరిది తీసేసింది
console.log(nums);
console.log(nums.unshift(5)); // 5 ని మొదట్లో చేర్చింది
console.log(nums);
console.log(nums.shift()); // మొదటిది తీసేసింది
console.log(nums);
4
[ 10, 20, 30, 40 ]
40
[ 10, 20, 30 ]
4
[ 5, 10, 20, 30 ]
5
[ 10, 20, 30 ]
ఈ Methods ఏమి రిటర్న్ చేస్తాయి? (Return Values)
| Method | తిరిగి ఇచ్చే ఫలితం (Return Value) | పై ఉదాహరణలో ఫలితం |
|---|---|---|
push |
ఎలిమెంట్ చేర్చిన తర్వాత వచ్చే కొత్త length | 4 |
pop |
అరే నుండి తొలగించిన element | 40 |
unshift |
ఎలిమెంట్ చేర్చిన తర్వాత వచ్చే కొత్త length | 4 |
shift |
అరే నుండి తొలగించిన element | 5 |
ఈ నాలుగు methods కూడా నేరుగా అసలు array లోని డేటాను మార్చివేస్తాయి (దీన్ని ప్రోగ్రామింగ్ లో "mutate చేయడం" అంటారు). ఖాళీ array మీద pop() చేస్తే ఎలాంటి crash లేదా error రాదు, కేవలం undefined వస్తుంది:
console.log([].pop()); // Output: undefined
Array లోని ప్రతి ఎలిమెంట్ని ఒక్కొక్కటిగా విజిట్ చేసి చూడాలంటే loops వాడతాం (Chapter 10 లో మనం నేర్చుకున్న లూప్స్ ఇక్కడ ఎంతగానో తోడ్పడతాయి).
1. సాధారణ for loop (ఇండెక్స్ అవసరమైనప్పుడు):
const marks = [80, 65, 90, 55];
for (let i = 0; i < marks.length; i++) {
console.log(`marks[${i}] = ${marks[i]}`);
}
marks[0] = 80
marks[1] = 65
marks[2] = 90
marks[3] = 55
let i = 0: array index ఎప్పుడూ 0 తో మొదలవుతుంది.i < marks.length: ఇక్కడ<మాత్రమే వాడాలి,<=వాడకూడదు! ఒకవేళ<=వాడితే,marks[4]ని కూడా చదువుతుంది, అక్కడ ఏమీ ఉండదు కాబట్టిundefinedవస్తుంది (దీన్ని off-by-one బగ్ అంటారు).
2. for...of loop (విలువలు మాత్రమే కావాలంటే — అత్యంత సులభం):
const fruits = ["Apple", "Banana", "Mango"];
for (const fruit of fruits) {
console.log(fruit);
}
Apple
Banana
Mango
మీకు index నంబర్ తో పనిలేకుండా కేవలం అరే లోని విలువలు (values) మాత్రమే కావాలంటే for...of రాయడం మరియు చదవడం రెండూ ఎంతో సులభం.
ఉదాహరణ 1: మార్కుల మొత్తం మరియు సగటు (Sum & Average)
const marks = [80, 65, 90, 55];
let sum = 0;
for (let i = 0; i < marks.length; i++) {
sum += marks[i];
}
console.log("మొత్తం:", sum);
console.log("సగటు:", sum / marks.length);
మొత్తం: 290
సగటు: 72.5
sum ని లూప్ బయట 0 తో ప్రారంభించాం. లూప్ లో ప్రతి మార్కుని దానికి జోడిస్తూ వెళ్ళాం.
ఉదాహరణ 2: అత్యధిక విలువను కనుగొనడం (Find Maximum)
const marks = [80, 65, 90, 55];
let max = marks[0];
for (const m of marks) {
if (m > max) {
max = m;
}
}
console.log("అతి పెద్ద మార్కు:", max);
అతి పెద్ద మార్కు: 90
ఉదాహరణ 3: సరి సంఖ్యలను లెక్కించడం (Count Evens)
let count = 0;
for (const n of [3, 8, 12, 7, 4]) {
if (n % 2 === 0) {
count++;
}
}
console.log("సరి సంఖ్యలు:", count);
సరి సంఖ్యలు: 3
ఒక array లోపల మరిన్ని arrays ని పెట్టవచ్చు. దీన్ని 2D Array (పట్టిక, matrix లేదా గ్రిడ్) అంటారు. ఒక క్లాస్ రూమ్ లో వరుసలు (rows) మరియు కాలమ్ లు (columns) లాగా ఊహించుకోవచ్చు.
const matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
];
console.log(matrix[1][2]);
console.log(matrix[0]);
console.log(matrix);
console.log(matrix[0][0], matrix[1][1], matrix[2][2]);
6
[ 1, 2, 3 ]
[ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ] ]
1 5 9
matrix[1]అంటే రెండవ అడ్డు వరుస (row):[4, 5, 6].matrix[1][2]అంటే రెండవ వరుసలో మూడవ విలువ:6. మొదటి[ ]వరుసను (row), రెండవ[ ]నిలువు కాలమ్ను (column) సూచిస్తుంది.matrix[0][0], matrix[1][1], matrix[2][2]అనేవి ప్రధాన వికర్ణం (diagonal) విలువలు:1 5 9.
-
Index 1 నుంచి మొదలవుతుందనుకోవడం: మొదటి element
arr[0]అవుతుంది కానీarr[1]కాదు. ఇది ప్రతి ప్రారంభ ప్రోగ్రామర్ చేసే అత్యంత సాధారణ తప్పు. -
చివరి index ని length అనుకోవడం: array లో 3 elements ఉంటే చివరి index 2 మాత్రమే.
arr[arr.length]ఎల్లప్పుడూundefinedఇస్తుంది. -
Arrays ని
===తో పోల్చడం (Reference Comparison):
రెండు arrays లో ఒకేలాంటి సమాన విలువలు ఉన్నప్పటికీ, కంప్యూటర్ ర్యామ్ (memory) లో అవి వేర్వేరు ప్రదేశాల్లో ఉంటాయి.console.log([1, 2] === [1, 2]); // Output: false===కేవలం మెమరీ అడ్రస్లను మాత్రమే పోలుస్తుంది, కాబట్టిfalseవస్తుంది. -
Array ని కాపీ చేశాననుకోవడం (కానీ ఒకే రిఫరెన్స్ ఉండటం):
నిజమైన కాపీ కావాలంటేconst a = [1, 2, 3]; const b = a; // ❌ కొత్త కాపీ కాదు! అదే అరే కి మరో పేరు. b.push(4); console.log(a); // Output: [ 1, 2, 3, 4 ]a.slice()లేదా స్ప్రెడ్ ఆపరేటర్[...a]వాడాలి:const a = [1, 2, 3]; const copy = a.slice(); copy.push(99); console.log(a); // [ 1, 2, 3 ] (అసలుది సేఫ్!) console.log(copy); // [ 1, 2, 3, 99 ] -
const array కి కొత్త array ని ఇవ్వడం:
const f2 = ["a"]; f2 = [];రాస్తేTypeError: Assignment to constant variableవస్తుంది.
ముందుగా తెలుసుకోవాల్సిన ముఖ్యమైన వర్గీకరణ:
JavaScript array methods ని రెండు రకాలుగా వర్గీకరించవచ్చు:
- Mutating Methods (అసలు array ని మార్చేవి):
push, pop, shift, unshift, splice, sort, reverse. - Non-mutating Methods (అసలు array ని మార్చకుండా సరికొత్త array ఇచ్చేవి):
map, filter, slice, concat, join, find, includes, reduce.
ఈ పార్ట్లోని చాలా మెథడ్స్ ఒక callback function (Chapter 13 లో నేర్చుకున్న Arrow Function) ని ఇన్పుట్ గా తీసుకుంటాయి. అంటే "ప్రతి ఎలిమెంట్తో ఈ పని చెయ్యి" అని మనం JavaScript కి సూచన ఇస్తాం.
1. forEach: ప్రతి element తో ఏదైనా ఒక పని చేయడం
forEach ప్రతి ఎలిమెంట్ కి ఇచ్చిన ఫంక్షన్ని ఒకసారి రన్ చేస్తుంది. ఇది ఎలాంటి కొత్త array ని return చేయదు; కేవలం ప్రింట్ చేయడం లేదా ఏదైనా పని చేయడానికి వాడతాం.
["Apple", "Banana", "Mango"].forEach((fruit, index) => {
console.log(`${index}: ${fruit}`);
});
0: Apple
1: Banana
2: Mango
2. map: ప్రతి element ని మార్చి (transform) కొత్త array తయారు చేయడం
map ప్రతి విలువపై ఫంక్షన్ ని అప్లై చేసి, అసలు array కి సమానమైన పొడవు (length) ఉన్న సరికొత్త array ని ఇస్తుంది. అసలు array ఏమాత్రం మారదు.
// డబుల్ చేయడం
console.log([10, 20, 30].map(n => n * 2));
// షాప్ వస్తువుల ధరలకు 18% GST కలపడం
console.log([100, 250, 400].map(p => p + p * 18 / 100));
[ 20, 40, 60 ]
[ 118, 295, 472 ]
3. filter: షరతుకు సరిపోయే elements ని మాత్రమే వడకట్టడం (Filtering)
మనం ఇచ్చే ఫంక్షన్ ఏ ఎలిమెంట్స్ కి అయితే true ని రిటర్న్ చేస్తుందో, వాటిని మాత్రమే ఎంపిక చేసి కొత్త array లో ఉంచుతుంది.
// పాస్ మార్కులు (35 లేదా అంతకంటే ఎక్కువ) మాత్రమే వడకట్టడం
console.log([80, 30, 55, 20, 90].filter(m => m >= 35));
[ 80, 55, 90 ]
4. reduce: అన్ని విలువలనూ కలిపి ఒకే విలువగా సంగ్రహించడం (Accumulator)
మొత్తం array ని చదివి, చివరకు ఒకే సంఖ్య లేదా స్ట్రింగ్ వంటి ఒకే ఒక్క విలువగా మార్చడానికి reduce వాడతాం.
console.log([10, 20, 30].reduce((total, n) => total + n, 0));
60
ఇది తెరవెనుక ఎలా పనిచేసిందో దశలవారీగా చూద్దాం: reduce కి ఫంక్షన్ తో పాటు ప్రారంభ విలువగా 0 ఇచ్చాం:
| రౌండ్ (Round) | total (మునుపటి నిల్వ) | n (ప్రస్తుత element) | total + n (కొత్త నిల్వ) |
|---|---|---|---|
| 1 | 0 | 10 | 10 |
| 2 | 10 | 20 | 30 |
| 3 | 30 | 30 | 60 |
ఈ నాలుగింటి మధ్య స్పష్టమైన తేడా (Quick Comparison Table)
| Method | ఏం తిరిగి ఇస్తుంది? (Return Value) | ఎప్పుడు వాడాలి? |
|---|---|---|
forEach |
ఏమీ ఇవ్వదు (undefined) | ప్రతి ఎలిమెంట్ తో ఒక పని చేయాలి (print, DB save వంటివి) |
map |
అంతే పొడవు ఉన్న సరికొత్త array | ప్రతి element ని మార్చి కొత్త array తయారు చేయాలి |
filter |
చిన్నదైన (లేదా సమాన) కొత్త array | కొన్ని షరతులకు సరిపోయేవి మాత్రమే ఎంపిక చేసుకోవాలి |
reduce |
ఒకే ఒక్క విలువ (Single value) | అన్నిటినీ కలపాలి (మొత్తం సంకలనం, గరిష్ట విలువ మొదలైనవి) |
అరే లోని నిర్దిష్ట విలువలను శోధించడానికి మరియు ధృవీకరించడానికి ఈ మెథడ్స్ వాడతాం:
const numbers = [5, 12, 8, 130, 44];
console.log(numbers.find(n => n > 10));
console.log(numbers.findIndex(n => n > 10));
console.log(numbers.find(n => n > 1000));
12
1
undefined
find: షరతుకు సరిపోయే మొట్టమొదటి element ని ఇస్తుంది (12). ఏదీ సరిపోకపోతేundefinedవస్తుంది.findIndex: ఆ మొట్టమొదటి element యొక్క index స్థానాన్ని ఇస్తుంది (1). సరిపోయేది ఏదీ లేకపోతే-1ఇస్తుంది.
const numbers = [5, 12, 8, 130];
console.log(numbers.some(n => n > 100)); // కనీసం ఒక్కటైనా ఉందా?
console.log(numbers.every(n => n > 0)); // అన్నీ 0 కంటే పెద్దవేనా?
console.log(numbers.every(n => n > 10)); // అన్నీ 10 కంటే పెద్దవేనా?
true
true
false
some: కనీసం ఒక్క element అయినా షరతును పాటిస్తేtrueఇస్తుంది (130 > 100 ఉంది కాబట్టి true).every: అన్నీ elements ఖచ్చితంగా షరతును పాటిస్తేనేtrueఇస్తుంది. (5 మరియు 8 లు 10 కంటే పెద్దవి కావు కాబట్టి ఆఖరి దానికి false వచ్చింది).
ఒక సాధారణ విలువ array లో ఉందా లేదా అని త్వరగా తెలుసుకోవడానికి:
const fruits = ["Apple", "Banana", "Mango"];
console.log(fruits.includes("Mango"), fruits.includes("Grapes"));
console.log(fruits.indexOf("Banana"), fruits.indexOf("Grapes"));
true false
1 -1
includes(x): ఉందా లేదా అని సింపుల్ గాtrue / falseచెబుతుంది.indexOf(x): అది ఏ index స్థానంలో ఉందో నంబర్ ఇస్తుంది. ఒకవేళ లిస్ట్ లో లేకపోతే-1ఇస్తుంది.
పేర్లు దాదాపు ఒకేలా ఉన్నా, ఈ రెండూ పూర్తిగా భిన్నమైన పనులు చేస్తాయి. ఇంటర్వ్యూలలో ఇది రెగ్యులర్ ప్రశ్న!
slice(start, end): ఒక భాగాన్ని కాపీ చేయడం (అసలు array మారదు)
కేక్ ముక్కను చూసి ఫోటో తీసుకున్నట్లు. అసలు కేక్ అలాగే ఉంటుంది.
const arr = [1, 2, 3, 4, 5];
console.log(arr.slice(1, 3));
console.log(arr);
[ 2, 3 ]
[ 1, 2, 3, 4, 5 ]
slice(1, 3) index 1 నుండి మొదలుపెట్టి, index 3 కంటే ముందు వరకు (3 ని కలపకుండా) కాపీ చేస్తుంది: అంటే index 1 మరియు 2 విలువలు [2, 3]. అసలు array arr ఏమాత్రం మారలేదు.
splice(start, deleteCount, ...items): array ని కత్తిరించడం / అతికించడం (అసలు array మారుతుంది)
కేక్ లోని భాగాన్ని కత్తిరించి తీసివేయడం లేదా కొత్త ముక్కను అతికించడం వంటిది. అసలు array మారిపోతుంది.
const letters = ["a", "b", "c", "d"];
// index 1 వద్ద 2 elements ని తీసేయడం
console.log(letters.splice(1, 2));
console.log(letters);
// index 1 వద్ద ఏదీ తీసేయకుండా (0) "X" ని చేర్చడం
console.log(letters.splice(1, 0, "X"));
console.log(letters);
[ 'b', 'c' ]
[ 'a', 'd' ]
[]
[ 'a', 'X', 'd' ]
slice = Slice of cake to look at (కాపీ తీసుకో, అసలుది మారదు).
splice = Splice rope / Cut & Insert (కత్తిరించు, అసలు array మార్చబడుతుంది).
sort: క్రమంలో అమర్చడం
console.log(["Mango", "Apple", "Banana"].sort());
console.log([10, 9, 1, 100].sort());
[ 'Apple', 'Banana', 'Mango' ]
[ 1, 10, 100, 9 ]
అక్షరాలకి (strings) చక్కగా ఆల్ఫాబెటికల్ ఆర్డర్ లో పని చేసింది. కానీ సంఖ్యలకు చూడండి: [ 1, 10, 100, 9 ] అని వచ్చింది! [1, 9, 10, 100] రావాలి కదా? 9 కంటే 100 ముందెందుకు వచ్చింది?
కారణం: sort() మెథడ్ డిఫాల్ట్గా సంఖ్యలను కూడా టెక్స్ట్ (String) గా మార్చి ఆల్ఫాబెటికల్ ఆర్డర్ లో చూస్తుంది. డిక్షనరీ లో "100" అనేది "1" తో మొదలవుతుంది కాబట్టి "9" కంటే ముందు వస్తుంది!
పరిష్కారం: సంఖ్యలను sort చేసేటప్పుడు ఎప్పుడూ ఒక compare function ఇవ్వాలి:
// పెరుగుతున్న క్రమం (Ascending)
console.log([10, 9, 1, 100].sort((a, b) => a - b));
// తగ్గుతున్న క్రమం (Descending)
console.log([10, 9, 1, 100].sort((a, b) => b - a));
[ 1, 9, 10, 100 ]
[ 100, 10, 9, 1 ]
reverse, join, concat:
console.log([1, 2, 3].reverse());
console.log(["a", "b", "c"].join("-"));
console.log(["a", "b", "c"].join(""));
console.log([1, 2].concat([3, 4]));
[ 3, 2, 1 ]
a-b-c
abc
[ 1, 2, 3, 4 ]
reverse(): array ని వెనక్కి తిప్పుతుంది (ఇది అసలు array నే మారుస్తుంది).join(separator): array లోని అన్ని అంశాలను కలిపి ఒక string గా మారుస్తుంది.concat(other): రెండు arrays ని కలిపి ఒక కొత్త సంయుక్త array ని ఇస్తుంది.
map, filter వంటి non-mutating methods కొత్త array ని ఇస్తాయి కాబట్టి, వాటి వెంటనే డాట్ . పెట్టి ఇంకో మెథడ్ని అనుసంధానించవచ్చు. దీనిని Method Chaining అంటారు.
const total = [80, 30, 55, 20, 90]
.filter(m => m >= 35) // మొదట పాస్ అయిన మార్కులు: [80, 55, 90]
.reduce((t, m) => t + m, 0); // తర్వాత వాటి మొత్తం: 80 + 55 + 90
console.log(total);
225
"క్లాస్ లో పాస్ అయిన విద్యార్థుల మొత్తం మార్కులు ఎంత?" అనే పెద్ద సమస్యను లూప్స్, తాత్కాలిక వేరియబుల్స్ లేకుండా కేవలం 3 లైన్లలో సాధించాం. ఇదే ఆధునిక JavaScript Array Methods యొక్క సూపర్ పవర్!
-
సంఖ్యలను compare function లేకుండా sort() చేయడం:
[10, 9, 1, 100].sort()అనేది[1, 10, 100, 9]ని ఇస్తుంది. నంబర్స్ కి ఎప్పుడూ.sort((a, b) => a - b)రాయడం మర్చిపోకండి. -
map లో
{ }వాడిreturnమర్చిపోవడం:
Chapter 13 లో నేర్చుకున్నట్లు బాడీలోconsole.log([1, 2, 3].map(n => { n * 2; })); // Output: [ undefined, undefined, undefined ]{ }కర్లీ బ్రాకెట్లు పెడితే explicit గాreturn n * 2;అని రాయాలి. లేదా ఒకే లైన్ అయితేn => n * 2అని బ్రాకెట్లు లేకుండా రాయాలి. -
ఖాళీ array పై reduce కి ప్రారంభ విలువ ఇవ్వకపోవడం:
ఎల్లప్పుడూ ప్రారంభ విలువగా[].reduce((t, n) => t + n); // Output: TypeError: Reduce of empty array with no initial value0లేదా తగిన విలువను తప్పనిసరిగా ఇవ్వండి:reduce((t, n) => t + n, 0). -
sort మరియు reverse అసలు array ని మారుస్తాయని మర్చిపోవడం:
అసలు array సేఫ్ గా ఉండాలంటే, ముందుగాconst o = [1, 2, 3]; const r = o.reverse(); console.log(o, o === r); // Output: [ 3, 2, 1 ] trueo.slice().reverse()లేదా ఆధునిక బ్రౌజర్లలోo.toReversed()వాడాలి. -
slice మరియు splice ల పేర్లను కలగాపులగం చేయడం:
sliceకేవలం కాపీ చేస్తుంది (Safe),spliceఅసలు array లోని అంశాలను కట్ చేస్తుంది (Mutates). -
forEach లో break వాడాలనుకోవడం:
forEachని మధ్యలో ఆపలేం.breakరాస్తేSyntaxErrorవస్తుంది. మధ్యలోనే ఆపాల్సిన అవసరం ఉంటేfor...ofలూప్ లేదాsome / findవాడాలి.
ఈ క్రింది 8 ప్రశ్నలకు మీ సొంతంగా కోడ్ రాయడానికి ప్రయత్నించండి. ఆ తర్వాత సమాధానాలను పరిశీలించండి:
[12, 18, 25, 30, 15]array లోని సంఖ్యల మొత్తం మరియు సగటు కనుక్కోండి (loop తో).[45, 12, 89, 34]లో అతి పెద్ద సంఖ్యను loop తో కనుక్కోండి.[20, 60, 45, 80, 55]లో 50 కంటే ఎక్కువ ఉన్న సంఖ్యలు ఎన్ని? (filter వాడండి).[100, 200]ధరలను "₹100", "₹200" రూపంలో మార్చండి (map వాడండి).[3, 14, 21, 8]లో 7 తో భాగింపబడే మొదటి సంఖ్యను కనుక్కోండి (find).[5, 1, 9, 3]ని తగ్గుతున్న క్రమంలో (descending order) sort చేయండి.[1, 2, 3, 4, 5, 6]లో సరి సంఖ్యల మొత్తం కనుక్కోండి (filter + reduce chaining).[1, 2, 3, 4]ని reverse() వాడకుండా, loop తో తిరగేసి కొత్త array తయారు చేయండి.
👉 8 ప్రశ్నల సమాధానాలు చూడండి (Answers with Code & Output)
1. మొత్తం & సగటు:
const nums = [12, 18, 25, 30, 15];
let sum = 0;
for (const n of nums) {
sum += n;
}
console.log(sum, sum / nums.length);
// Output: 100 20
2. అతి పెద్ద సంఖ్య:
const nums = [45, 12, 89, 34];
let max = nums[0];
for (const n of nums) {
if (n > max) {
max = n;
}
}
console.log(max);
// Output: 89
3. 50 కంటే ఎక్కువ ఉన్న సంఖ్యల లెక్కింపు:
console.log([20, 60, 45, 80, 55].filter(n => n > 50).length);
// Output: 3 (filter ఫలితం [60, 80, 55], దాని .length 3)
4. కరెన్సీ సింబల్ మ్యాపింగ్:
console.log([100, 200].map(p => `₹${p}`));
// Output: [ '₹100', '₹200' ]
5. 7 తో భాగింపబడే మొదటి సంఖ్య:
console.log([3, 14, 21, 8].find(n => n % 7 === 0));
// Output: 14
6. తగ్గుతున్న క్రమంలో sort:
console.log([5, 1, 9, 3].sort((a, b) => b - a));
// Output: [ 9, 5, 3, 1 ]
7. సరి సంఖ్యల మొత్తం (Chaining):
const total = [1, 2, 3, 4, 5, 6]
.filter(n => n % 2 === 0)
.reduce((t, n) => t + n, 0);
console.log(total);
// Output: 12 (సరి సంఖ్యలు [2, 4, 6], మొత్తం 12)
8. లూప్ తో అరే రివర్స్ చేయడం:
const original = [1, 2, 3, 4];
const reversed = [];
for (let i = original.length - 1; i >= 0; i--) {
reversed.push(original[i]);
}
console.log(reversed);
// Output: [ 4, 3, 2, 1 ]
(చివరి index నుండి మొదలుపెట్టి, వెనక్కి వస్తూ ప్రతి విలువను కొత్త array లోకి push చేశాం.)
ఈ కోడ్ ను మన ఆన్లైన్ కంపైలర్ లో రన్ చేసి చూడండి. ఇది ఒక ఇ-కామర్స్ షాపింగ్ కార్ట్. ధరలను మార్చండి, కొత్త వస్తువులను push చేయండి మరియు filter, reduce లు ఎలా పనిచేస్తున్నాయో గమనించండి:
const cart = [250, 120, 80, 300];
const total = cart.reduce((t, p) => t + p, 0);
const expensive = cart.filter(p => p > 100);
console.log("మొత్తం బిల్లు:", total);
console.log("₹100 కంటే ఎక్కువ ధర ఉన్నవి:", expensive);
cart.push(150);
console.log("కొత్త item తో మొత్తం:", cart.reduce((t, p) => t + p, 0));
మొత్తం బిల్లు: 750
₹100 కంటే ఎక్కువ ధర ఉన్నవి: [ 250, 120, 300 ]
కొత్త item తో మొత్తం: 900
📌 సారాంశం (Quick Summary):
Part A: Arrays Basics
- Array = ఒకే చోట చాలా విలువలను వరుసగా నిల్వ చేసే లిస్ట్:
const fruits = ["Apple", "Banana"]; - Index 0 నుంచి మొదలవుతుంది: చివరి element:
arr[arr.length - 1](లేదా ఆధునికarr.at(-1)). లేని indexundefinedఇస్తుంది. - push (చివరన చేర్చు), pop (చివరిది తీసేయి), unshift (మొదట చేర్చు), shift (మొదటిది తీసేయి). ఇవి అసలు array ని మారుస్తాయి (Mutate).
constarray లోపలి విలువలను మార్చొచ్చు, కానీ సరికొత్త array ని reassignment చేయలేం.- లూపింగ్ కోసం ఇండెక్స్ కావాలంటే సాధారణ
forloop, కేవలం విలువలు కావాలంటేfor...ofloop. - Arrays ని
===తో పోల్చవద్దు.const b = aకొత్త కాపీ కాదు, అదే రిఫరెన్స్. నిజమైన కాపీకిa.slice()వాడాలి. - 2D array:
matrix[row][column].
Part B: Array Methods
- forEach (పని చేయి), map (మార్చి కొత్త array ఇవ్వు), filter (షరతుతో వడకట్టు), reduce (అన్నింటినీ ఒకే విలువగా కలుపు).
- find / findIndex (మొదటి దానిని వెతుకు), some (కనీసం ఒక్కటైనా), every (అన్నీ), includes / indexOf (ఉందా?).
- slice (కాపీ మాత్రమే చేస్తుంది, అసలుది మారదు) vs splice (కత్తిరించి అసలు array ని మారుస్తుంది).
sortకి సంఖ్యల కోసం(a, b) => a - bకంపేర్ ఫంక్షన్ తప్పనిసరి.sortమరియుreverseఅసలు array నే మారుస్తాయి.joinarray ని string గా మారుస్తుంది,concatరెండు arrays ని కలుపుతుంది.map,filter,reduceలను ఒకదాని తర్వాత ఒకటి chain చేయవచ్చు.
👉 తర్వాతి పాఠం: Objects (JSON intro తో) →
ఇప్పటివరకు మనం నంబర్ల (ఇండెక్సుల) ఆధారంగా వరుస క్రమంలో డేటాను నిల్వ చేసే Arrays గురించి నేర్చుకున్నాం. తర్వాతి పాఠంలో ఒక వస్తువు లేదా వ్యక్తి యొక్క సమగ్ర వివరాలను (పేరు, వయసు, చిరునామా) ప్రాపర్టీ పేర్లతో సహా ఒకే చోట నిల్వ చేసే అత్యంత ముఖ్యమైన Objects (మరియు JSON బేసిక్స్) గురించి నేర్చుకుందాం!