Javascript Array Access undefined - javascript

I am totally new to javascript, but I can program in Java, C# etc. already.
I want to generate a card deck, and after that I want to access this array of cards.
function Card(rank, suit)
{
this.rank = rank;
this.suit = suit;
}
function Deck()
{
this.ranks = new Array("A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K");
this.suits = new Array("Hearts", "Clubs", "Diamonds", "Spades");
this.cards = Array(52);
this.makeDeck = function()
{
console.log("Executed MakeDeck!");
for(var i = 0; i < this.suits.length; i++)
{
for(var j = 0; j < this.ranks.length; j++)
{
this.cards.push(new Card(this.ranks[j],this.suits[i]));
}
}
}
}
function btnClick()
{
var deck = new Deck();
deck.makeDeck();
console.log(deck.cards[0]);
}
In the function "btnClick()" I want to log the first item in the array, but the console just tells my "undefined". I can't find my mistake, maybe you can help me?

The problem is that you have initialised an array with 52 elements... and you are then pushing more elements onto it.
What you need to do is just have this.cards = [];. JavaScript has variable-length arrays.

Related

How to make a loop with this array?

in Javascript for example I have this array:
var ids = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"];
(The number of objects in the array changes constantly)
How could I get this result (a new array), and how can I separate it? for example in 3 (I probably need to make a loop for this)
var urls= ["example.com/?id0=1&id1=2&id2=3", "example.com/?id3=4&id4=5&id5=6", "example.com/?id6=7&id7=8&id8=9", "example.com/?id9=10"]
Thanks.
Use .map to add id to the ids and join the resulting array with &
var ids = ["10000000", "2000000", "1234567", "7654321", "7777777"];
var url = "example.com/?" + ids.map((id, ndx) => `id${ndx}=${id}`).join("&");
console.log(url);
EDIT
Based on the edited question, you can create function to split the array of ids into chunks and use the same code as before, map the chunks to add id and join them with &
var ids = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "xxx"];
const generateUrls = (ids, n = 3) => {
var i,
j,
temparray,
urls = [],
ndx = 0;
for (i = 0, j = ids.length; i < j; i += n) {
temparray =
"example.com/?" +
ids
.slice(i, i + n)
.map(id => `id${ndx++}=${id}`)
.join("&");
urls.push(temparray);
}
return urls;
};
const result = generateUrls(ids, 3);
console.log(result);

jQuery/Javascript show result from to

This is new question that is rewritten using javascript/jQuery of this thread because i can't do this in MySQL directly query.
MySQL Select id from to and exclude beginning and ending id
So question is simple:
I have array that have received from MySQL query into javascript array:
var array = ["m2", "1", "2", "11", "12", "m4", "m3", "m5", "17", "m1"];
And need function that accept parameter from what array value to show. For example:
function showCategories(marker){
}
So in above example if i call showCategories("m2"); i need to get this:
1
2
11
12
If i call showCategories("m5"); i need to get this:
17
I im currently trying to substr and find index of begin "m2" in first example and find last m index (that is m4) and remove other items from array..is there simple way?
Find the index of your marker, slice everything after it, then find the first "m" index in that array and slice up to it. All that's left is the numbers in between.
var array = ["m2", "1", "2", "11", "12", "m4", "m3", "m5", "17", "m1"];
function showCategories(marker){
let start = array.indexOf(marker);
if (start === -1) return [];
let slicedArray = array.slice(start + 1);
let end = slicedArray.findIndex(val => val.startsWith("m"));
return slicedArray.slice(0, end);
}
console.log(showCategories("m2"));
console.log(showCategories("m5"));
var array = ["m2", "1", "2", "11", "12", "m4", "m3", "m5", "17", "m1"];
function showCategories(marker) {
let currentCat = 'n';
return array.reduce((obj, item) => {
if (item.indexOf("m") === -1) {
obj[currentCat].push(item);
} else {
currentCat = item;
obj[currentCat] = [];
}
return obj;
}, {})[marker] || [];
}
console.log(showCategories("m2"));
console.log(showCategories("m5"));
Logic process
As you can see, I am using reduce and detecting if the value in the item contains an m which would indicate a new "category".
Then, I stuff all the values following the new category into an array until another category, again containing m, shows up.
Hope this helps.
Well I think you could loop through to find the index needed and store the result into a subarray.
One way would be to loop until you find the "m2" by doing:
function showCategories(find)
{
let returnArray = [];
let start = null;
if (array.includes(find) //checks if the element exists
{
for(int i = 0; i < array.length; i++)
{
if (start == null && array[i] == "m2") //looks for element
{
start = i;
}
else if(isNaN(Number(array[i]))) //pushes element into array
{
returnArray.push(array[i]);
}
else if(start != null && !isNaN(Number(array[i]))) //breaks if element after find is not an int
{
break;
}
}
}
return returnArray;
}
I haven't tested this, but something along these lines would work.

Read array values in a loop in JavaScript

I have an array in JavaScript that have defined these values:
var myStringArray = ["1","2","3","4","5","6","7","8","9","10"];
And when I call a function the first time function, I need to get this:
1
2
3
Calling it again I need to get:
4
5
6
Calling it again:
7
8
9
Calling it again:
10
1
2
Calling again:
3
4
5
And so on. You got the point, showing 3 values from the array and if we are at the end of array, read from the beginning... I have an app that has remote control and has down and up keys. When the user presses the down button to get these values from an array as described in the above example, if the user presses the up button it needs to go back from an example...so reading the array in a loop (at end, the array is read from the beginning, but always shows three values).
I try using this:
var myStringArray = ["1","2","3","4","5","6","7","8","9","10"];
var arrayLength = myStringArray.length;
for (var i = 0; i < arrayLength; i++) {
if (i<(6)) {
console.log(myStringArray[i]);
}
}
But the next time I call this code, it shows from the beginning values of the array, not continue to read others value...do I need a second counter?
If you are OK with manipulating your original array as you loop through it you could splice and concat similar to below (or you could use a clone of the array if you need to persist the original array):
var myStringArray = ["1","2","3","4","5","6","7","8","9","10"];
var loopByX = function(x){
var y = myStringArray.splice(0,x);
myStringArray = myStringArray.concat(y);
return y;
}
console.log(loopByX(3));
console.log(loopByX(3));
console.log(loopByX(3));
console.log(loopByX(3));
console.log(loopByX(3));
If you want to go bi-directional (is that what you call it?), as mentioned in the comments, you could do it as below which then gives you the ability to go backwards or forward and the flexibility to do so in an arbitrary number:
var myStringArray = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"];
var loopByX = function(x) {
var len = myStringArray.length;
// Ensure x is always valid but you can add any behaviour here in that case yourself. As an example I return an empty array.
if (Math.abs(x) > len) {
return [];
}
var y = x > 0 ? myStringArray.splice(0, x) : myStringArray.splice(len + x, len);
myStringArray = x > 0 ? myStringArray.concat(y) : y.concat(myStringArray);
return y;
}
console.log(loopByX(20)); // invalid number
console.log(loopByX(-20)); // invalid number
console.log(loopByX(-3));
console.log(loopByX(-6));
console.log(loopByX(3));
console.log(loopByX(4));
You could take a function which slices three elements and if not possible, it takes the needed first values of the array as well.
function take3() {
var temp = array.slice(index, index += 3)
index %= array.length;
console.log(temp.concat(temp.length < 3 ? array.slice(0, index) : []).join(' '));
}
var array = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"],
index = 0;
<button onclick="take3()">take 3</button>
With a mapping of a dynamic count.
function take(length) {
console.log(Array.from({ length }, _ => array[++index, index %= array.length]));
}
var array = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"],
index = -1;
<button onclick="take(3)">take 3</button>
Your variable i is local to the for loop which means it basically resets every time the loop is started. So first make your variable i global.
var i=0;
function employeeNames(){
var empList = ["1","2","3","4","5","6","7","8","9","10"];
var output = [];
var j=0;
while(j<3)
{
output.push(empList[i])
i=(i+1)%empList.length;
j++;
}
return output;
}
console.log(employeeNames());
console.log(employeeNames());
console.log(employeeNames());
console.log(employeeNames());
console.log(employeeNames());
If you want the immutable way to achieve your circular looping
function loopArray(arr, step=3) {
let i = 0;
return function inner() {
for (let j = 0; j < step; j++) {
console.log(arr[i]);
i = (i + 1) % arr.length;
}
};
}
const func = loopArray(["1","2","3","4","5","6","7","8","9","10"], 3);
func();
func();
func();
func();
func();
The fancy solution with generator functions:
function* cycle(arr) {
let i=0;
while (true) {
yield arr[i++];
i %= arr.length;
}
}
function* chunksOf(n, iterable) {
let chunk = [];
for (const x of iterable) {
chunk.push(x)
if (chunk.length >= n) {
yield chunk;
chunk = [];
}
}
if (chunk.length > 0)
yield chunk;
}
function toFunction(iterator) {
return () => iterator.next().value;
}
var myStringArray = ["1","2","3","4","5","6","7","8","9","10"];
const f = toFunction(chunksOf(3, cycle(myStringArray)));
console.log(f());
console.log(f());
console.log(f());
// …
#Igor Petev, JavaScript's closures are a nice concept that you can use to solve your problem.
Please read JavaScript's Closures - w3schools article. It's really nice and excellent.
I have used the concept of closures to solve this problem. Please leave a comment if you don't understand my code or anything else related to this problem.
Please have a look at the below code.
var get3items = (function () {
var index = 0;
var myStringArray = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"];
var len = myStringArray.length
return function () {
for(var count = 0; count < 3; count += 1)
{
console.log(myStringArray[index]);
if(index == (len - 1))
{
index = 0;
}
else {
index += 1;
}
}
}
})();
get3items (); // First call
console.log()
get3items (); // Second call
console.log()
get3items (); // Third call
console.log()
get3items (); // Fourth call
console.log()
get3items (); // Fifth call
/*
1
2
3
4
5
6
7
8
9
10
1
2
3
4
5
*/
How about using a generator:
function* get3() {
var myStringArray = ["1","2","3","4","5","6","7","8","9","10"];
var index = 0;
while (true) {
yield [0, 1, 2].map(i => myStringArray[(index + i) % myStringArray.length])
index = (index + 3) % myStringArray.length;
}
}
Calling this function returns an object which you can call .next() on, to get the next set of 3:
var getter = get3();
console.log(getter.next().value); // ["1","2","3"]
console.log(getter.next().value); // ["4","5","6"]
console.log(getter.next().value); // ["7","8","9"]
// etc.
function* employeeNames(){
var empList = ["1","2","3","4","5","6","7","8","9","10"];
for(var i =0; i<=empList.length; i++){
yield empList[i];
}
}
var emp;
emp = employeeNames();
It uses a generator function...

Randomize two arrays and output the same "randomized" result

I am using JavaScript/jQuery to random two list of arrays, one with the word and the other there definition.
I want each load to select 5 out of the available 10 in each array so that were I am running into issues.
I am able to randomize both arrays but I need both to output the same "random" result so they can match both sides.
var match1 = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"];
var match2 = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"];
and is current output is something like
match1 = 2 5 7 8 3
match1 = 1 3 9 4 5
and I need somthing like this
match1 = 7 5 2 8 1
match1 = 7 5 2 8 1
I am new to JavaScript so sorry for the messy code.
function createQuizLayout() {
//this are the draggables (#leftCol)
var match1 = ["1",
"2",
"3",
"4",
"5",
"6",
"7",
"8",
"9",
"10"
];
//this are drop target (#rightCol)
var match2 = ["1",
"2",
"3",
"4",
"5",
"6",
"7",
"8",
"9",
"10"
];
function randomSort(min, max) {
return (parseInt(Math.random() * 10) % 2);
}
(match1.sort(randomSort));
(match2.sort(randomSort));
var arrMatch1 = [];
for (var i = 0; i < match1.length; i++) {
arrMatch1.push('<li data-index="' + (i + 1) + '">' + match1[i] + '</li>');
arrMatch1.length = arrMatch1.length < 5 ? arrMatch1.length : 5;
}
var arrMatch2 = [];
for (var i = 0; i < match2.length; i++) {
arrMatch2.push('<li data-index="' + (i + 1) + '">' + match2[i] + '</li>');
arrMatch2.length = arrMatch2.length < 5 ? arrMatch2.length : 5;
}
//shuffle the arrays
arrMatch1 = shuffle(arrMatch1);
arrMatch2 = shuffle(arrMatch2);
//insert them into DOM
$('#source').html(arrMatch1.join(''));
$('#target').html(arrMatch2.join(''));
}
function shuffle(v) {
for (var j, x, i = v.length; i; j = parseInt(Math.random() * i), x = v[--i], v[i] = v[j], v[j] = x);
return v;
}
I'm pretty sure you missed the part How to shuffle the two arrays the right (same) way :)
Have a look at this code:
var match1 = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"];
var match2 = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"];
var i=0, len= match1.length, next, order=[];
while(i<len)order[i]= ++i;
order.sort(function(){return Math.random()-.5});
for(i=0; i<len; i++){
next=order[i];
match1.push(match1[next]);
match2.push(match2[next]);
}
match1.splice(1, len);
match2.splice(1, len);
console.log(match1)
console.log(match2)
To change your arrays in place, get the shuffled order first and add the new arrangements to the end of the existing array (match1).
Then splice out from index 1 splits the array into your two (same way shuffled) arrays with exactly the same length.

Comparing two arrays and push in another array wrong position element

I got two arrays, both type string :
var correctAnswers = ["0", "1", "2", "3", "4", "5"];
and second :
var finalArray = ["0", "1", "4", "3", "5", "2"];
I would like to compare them and and if not match second with first to extract elements and push them in another array, like this :
finalArray = ["0", "1", "3"];
var toChange = ["4", "5", "2"];
You could use jQuery map method too:
var toChange = $.map(finalArray, function(v, k){
return correctAnswers[k] !== v ? v: null;
});
finalArray = $.map(finalArray, function(v, k){
return correctAnswers[k] === v ? v: null;
});
DEMO
Or using array.prototype.filter():
var toChange = finalArray.filter(function(v, k){
return correctAnswers[k] !== v;
});
finalArray = finalArray.filter(function(v, k){
return correctAnswers[k] === v;
});
filter DEMO
var toChange = [];
for (var i = finalArray.length - 1; i >= 0; i--) {
if (finalArray[i] !== correctAnswers[i]) {
toChange.push(finalArray[i]);
finalArray.splice(i, 1);
}
}
The key to this is iterating down from the length to 0, rather than up from 0 to the length as usual. This is because splice changes the indexes of all the elements after the element being removed, so normal iteration would skip an element after each splice.
This will do it:
http://jsfiddle.net/XiozZe/NkM6s/
var correctAnswers = ["0", "1", "2", "3", "4", "5"];
var finalArray = ["0", "1", "4", "3", "5", "2"];
var correctFinal = [];
var toChange = [];
for(var i = 0; i < correctAnswers.length; i++){
if(correctAnswers[i] === finalArray[i]){
correctFinal[correctFinal.length] = finalArray[i];
}
else{
toChange[toChange.length] = finalArray[i];
}
}
First you've got to define your variables
// Define your variables
var correctAnswers = ["0", "1", "2", "3", "4", "5"];
var answers = ["0", "1", "4", "3", "5", "2"];
var finalArray = [];
var toChange = [];
Then you create a loop, which loops over the Answers array.
// comparing them could be done with a simple loop
for (var i = 0; i<answers.length; i++) {
if (correctAnswers[i] == answers[i]) { //if they're equal, push the value into the final array
finalArray.push(answers[i]);
} else { // if not, push them into the toChange array
toChange.push(answers[i]);
}
}
This will give you toChange = [0, 1, 3]
If you want toChange = [0, 1] you've got to change it to
toChange = answers.slice(0);
for (var i = 0; i<correctAnswers.length; i++) {
if (correctAnswers[i] == Answers[i]) { //if they're equal, push the value into the final array and remove the first value from the toChange array
finalArray.push(Answers[i]);
toChange.shift();
} else { // if not, break
break;
}
}
Fiddle

Categories

Resources