Destructure complex object - javascript

I'm trying to destruct a complex object, but I get no output in my console. I can't see why. I always get some sort of Uncaught SyntaxError in the browser. I'm trying to figure out what I'm doing wrong here. (EDIT: I'M ONLY TRYING TO LOG THE "HITS" TO THE BROWSER CONSOLE, NOT ACTUALLY PRINT THEM IN THE BROWSER) Here is the code:
let catalog = {
"artists": [
{
name: "Journey",
"hits": [
"Faithfully",
"Only the Young",
"Dont Stop Believing"
],
name: "REO Speedwagon",
hits: [
"Keep On Loving You",
"Time for Me to Fly",
"Cant Fight This Feeling"
],
name: "Styx",
hits: [
"Come Sail Away",
"Mr. Roboto",
"Blue Collar Man"
]
}
]
};
let { hits } = catalog.artists;
for (x in hits) {
console.log(hits[x]);
};

This code has "some" more problems then just the " chars on the first hits which are way too much :) I think he wants to have a array of objects with the artist and the hits of the artists. BTW the album, tracklen etc. are missing dude ! ;)
let catalog = {
"artists": [{
name: "Journey",
hits: ["Faithfully", "Only the Young", "Dont Stop Believing"],
}, {
name: "REO Speedwagon",
hits: ["Keep On Loving You", "Time for Me to Fly", "Cant Fight This Feeling"]
}, {
name: "Styx",
hits: ["Come Sail Away", "Mr. Roboto", "Blue Collar Man"]
}]
};
and here our music lover was way to lazy. Otherwise he would have recognizce all the mistakes above :)
for (var i = 0; i < catalog.artists.length; i++) {
var hits = catalog.artists[i];
console.log(hits.name);
for (var j = 0; j < catalog.artists[i].hits.length; j++) {
console.log(" "+catalog.artists[i].hits[j]);
}
}
will result in:
Journey
Faithfully
Only the Young
Dont Stop Believing
REO Speedwagon
Keep On Loving You
Time for Me to Fly
Cant Fight This Feeling
Styx
Come Sail Away
Mr. Roboto
Blue Collar Man
Not all the times every shortcut is needed, fast or even a great idea to show how cool you are.In this case it mixed you up cause you can not see any step in between while debugging.
At least the music taste isnt that bad :) Have fun !

I think I understand your question. "hits" isn't nested directly under artists. "hits" is in an array of artists objects. I would just use an Array.map() to get the "hits" array off the "catalog.artists" array.
var catalog = {
artists: [{
name: "Journey",
hits: [
"Faithfully",
"Only the Young",
"Dont Stop Believing"
],
},
{
name: "REO Speedwagon",
hits: [
"Keep On Loving You",
"Time for Me to Fly",
"Cant Fight This Feeling"
],
},
{
name: "Styx",
hits: [
"Come Sail Away",
"Mr. Roboto",
"Blue Collar Man"
]
},
]
};
var hits = catalog.artists.map(x => x.hits);
console.log(hits);

Related

How to check if JavaScript objects differ from each another

I'm trying to compare 2 arrays of objects, and am currently doing it by using Array.length() which does not seem to be the right way based on what I'm trying to achieve.
I have these two Arrays of objects:
const array1 = [
{
"book_id": 285,
"status": "Borrowed",
"attributes": [
{
"name": "To Kill a Mockingbird",
"description": "Published in 1960, this timeless classic explores human behaviour and the collective conscience of The Deep South in the early 20th century. Humour entwines the delicate strands of prejudice, hatred, hypocrisy, love and innocence to create one of the best novels ever written.",
"borrowed_by": "John"
}
]
},
{
"book_id": 284,
"status": "Borrowed",
"attributes": [
{
"book_name": "ATTRIBSAMP 1",
"description": "Although 1984 has passed us by, George Orwell’s dystopian, totalitarian world of control, fear and lies has never been more relevant. Delve into the life of Winston Smith as he struggles with his developing human nature in a world where individuality, freewill and love are forbidden.",
"borrowed_by": "Bob"
}
]
}
]
VS
const array2 = [
{
"book_id": 285,
"status": "Free",
"attributes": [
{
"name": "To Kill a Mockingbird",
"description": "Published in 1960, this timeless classic explores human behaviour and the collective conscience of The Deep South in the early 20th century. Humour entwines the delicate strands of prejudice, hatred, hypocrisy, love and innocence to create one of the best novels ever written.",
"borrowed_by": ""
}
]
},
{
"book_id": 284,
"status": "Borrowed",
"attributes": [
{
"book_name": "ATTRIBSAMP 1",
"description": "Although 1984 has passed us by, George Orwell’s dystopian, totalitarian world of control, fear and lies has never been more relevant. Delve into the life of Winston Smith as he struggles with his developing human nature in a world where individuality, freewill and love are forbidden.",
"borrowed_by": "Bob"
}
]
}
]
Basically I want to check whether there are changes between the two, i.e. borrowed_by and/or status, I understand now that array1.length will be equal to array2.length since the array length would always be equal to 2. Is there an easier or better way to check this?
Expected output, I would like to call function callFunction1():
if(compare(array1,array2){
callFunction1();
} else {
null;
}
I currently have:
if(array1.length !== array2.length){
callFunction1();
} else {
null;
}
To close the question, I went with Lodash's _.isEqual for comparison
if(!_.isEqual(array1, array2){
callFunction1();
} else {
null;
}

How do I write this algorithm to search for the next question in a question tree?

I've been struggling to write the correct algorithm for this. So I have a tree of questions that looks like this:
[
{
question: "Question 1",
answers: {
"yes": [
{
question: "Question 1a",
answers: ["A", "B"]
}
],
"no": null
}
},
{
question: "Question 2",
answers: ["I agree"]
}
]
And I have a responses object, which could look something like this:
[
{ question: "Question 1", answer: "yes" },
{ question: "Question 1a", answer: "B" },
]
Or it could be this:
[
{ question: "Question 1", answer: "no" },
]
And now the code I'm struggling to write is to find out what the next question should be. The above two examples of the responses object should both point to the next question being "Question 2".
I'd like to have a function like getNextQuestion(questions, responses) which would then hopefully output:
{
question: "Question 2",
answers: ["I agree"]
}
I've figured out how to go down the tree, but I can't figure out how to go up the tree when that's necessary. Anybody willing to help?
Hmm, I may have fixed it with this code. It's been working okay so far.
getCurrentQuestion(questions, responses) {
if (!responses.length || !questions.length) {
return questions.length ? questions[0] : null
}
let response = responses.shift()
let question
do {
question = questions.shift()
} while (question.question !== response.question)
let answer = question.answers[response.answer]
return this.getCurrentQuestion(answer || questions, responses)
|| this.getCurrentQuestion(questions, responses)
}

Matches/indices returns entire string

Using http://fusejs.io/
In just about all situations, I'm finding that the 'indices returned contain pretty much the entire string.
For a very simple example, if you go to fusejs.io, and change the first object (in 'step 1' on the left) to
{
title: "so ummmmmm Old Man's War is a book about a thing",
author: {
firstName: "John",
lastName: "Scalzi"
}
},
then tick 'Include matches' (in 'step 2' in the middle)
the resulting indices matches most of the strong, including parts that are obviously way off:
"matches": [
{
"indices": [
[
0,
0
],
[
2,
2
],
[
4,
10
],
[
14,
23
]
],
"value": "so ummmmmm Old Man's War is a book about a thing",
"key": "title",
"arrayIndex": 0
}
]
whereas I'm expecting it to just return the matched part of the string, like so:
"matches": [
{
"indices": [
[
14,
23
]
],
"value": "Man's War",
"key": "title",
"arrayIndex": 0
}
]
I've tried it in my own app and seeing similar results across a large dataset. The matching itself is quite accurate - it's just the highlighting via matches[i].indices that's wrong. It seems to always match up to the matched string, and also sometimes far beyond. Am I going bonkers? Or is this just not possible with fuse.js?
Thanks!
P.S. Can someone please let me know if I'm supposed to include or not include the 'javascript' tag on a library question like this?

Javascript: Printing array of a constructor class

Posting only the parts needed.
// This program simulates purchases of musical albums through a loop.
// The user initially has 1000 dollars. As the program loops through the albums
// the user purchases random quantities. The program adds the subtotals and
// subtracts from the initial total to find out what the user has left.
// Variables for random quantity.
var min = 1,
max = 25;
// Constructor for Album class
function Album(title, artist, price, release){
this.title = title;
this.artist = artist;
this.price = price;
this.release = release;
this.quantity = (Math.floor(Math.random() * max) + min);
this.subtotal = this.quantity * this.price;
};
Album.prototype.purchase = function(){
this.quantity--;
if (this.quantity > 0){
return 1;
}
else{
return -1;
}
};
// Constructor for Cart class
function Cart(val){
this.items = [];
};
Cart.prototype.add = function(val){
this.items.push(val);
};
Cart.prototype.remove = function(val){
this.items.splice(albums.indexOf(val), 1);
};
// Object that inherit from the Album class.
var nothingSame = new Album('Nothing Was the Same', "Drake", 15.99, "09/24/2013");
nothingSame.tracklisting = ["Started from the Bottom", "All Me", "Pound Cake", "The Language"];
var lifeOfPablo = new Album("The Life of Pablo", "Kanye West", 15.98, "02/14/2016");
lifeOfPablo.tracklisting = ["Ultralight Beam", "Famous", "Feedback", "Low Lights"];
var babel = new Album("Babel", "Mumford & Sons", 13.83, "09/21/2012");
babel.tracklisting = ["I Will Wait", "Lover of the Light", "Whispers in the Dark", "Babel"];
var ghostStories = new Album("Ghost Stories", "Coldplay", 12.61, "05/16/2014");
ghostStories.tracklisting = ["Magic", "Midnight", "A Sky Full of Stars", "True Love"];
var trueAlbum = new Album("True", "Avicii", 15.99, "09/13/2013");
trueAlbum.tracklisting = ["Wake Me Up", "You Make Me", "Hey Brother", "Lay Me Down"];
// Array of the albums for the objects within them.
var albums = [nothingSame, lifeOfPablo, babel, ghostStories, trueAlbum];
//Variables the initial amount of money
var INITIAL_MONEY = 1000.00;
var n = 1000.00;
// Instance of cart.
var cart = new Cart();
// Loop that simulates the purchase.
var i = 0;
while(INITIAL_MONEY > 0 && i < albums.length){
if (INITIAL_MONEY >= albums[i].subtotal){
albums[i].purchase();
INITIAL_MONEY = INITIAL_MONEY - albums[i].subtotal;
cart.add(albums[i]);
}
i++;
}
// Variable for the total amount spent.
var total = n - INITIAL_MONEY;
// Console logs to output all the data to the user.
console.log("You walk into a store with $1000 and purchase several albums.")
console.log(cart);
console.log("Total: " + total.toFixed(2));
console.log("Money Remaining: " + INITIAL_MONEY.toFixed(2));
Output Example:
You walk into a store with $1000 and purchase several albums.
Cart {
items:
[ Album {
title: 'Nothing Was the Same',
artist: 'Drake',
price: 15.99,
release: '09/24/2013',
quantity: 22,
subtotal: 367.77,
tracklisting: [Object] },
Album {
title: 'The Life of Pablo',
artist: 'Kanye West',
price: 15.98,
release: '02/14/2016',
quantity: 1,
subtotal: 31.96,
tracklisting: [Object] },
Album {
title: 'Babel',
artist: 'Mumford & Sons',
price: 13.83,
release: '09/21/2012',
quantity: 1,
subtotal: 27.66,
tracklisting: [Object] },
Album {
title: 'Ghost Stories',
artist: 'Coldplay',
price: 12.61,
release: '05/16/2014',
quantity: 4,
subtotal: 63.05,
tracklisting: [Object] },
Album {
title: 'True',
artist: 'Avicii',
price: 15.99,
release: '09/13/2013',
quantity: 18,
subtotal: 303.81,
tracklisting: [Object] } ] }
Total: 794.25
Money Remaining: 205.75
I can't figure out how to get the track listing to show. Closest I got to it, it only showed the last track in the array for all of them. I can't seem to get each of the albums to display the listed tracks in the output.
If you want to output this for debugging or toString purposes, you can try JSON.stringify(albums, null, 2).
If you want it displayed in the console, using console.log, try console.log(JSON.stringify(albums, null, 2))
Edit:
Applied to your Cart implementation, use console.log(JSON.stringify(cart, null, 2)) in place of console.log(cart).
Sample output
{
"items": [
{
"title": "Nothing Was the Same",
"artist": "Drake",
"price": 15.99,
"release": "09/24/2013",
"quantity": 18,
"subtotal": 303.81,
"tracklisting": [
"Started from the Bottom",
"All Me",
"Pound Cake",
"The Language"
]
},
{
"title": "The Life of Pablo",
"artist": "Kanye West",
"price": 15.98,
"release": "02/14/2016",
"quantity": 15,
"subtotal": 255.68,
"tracklisting": [
"Ultralight Beam",
"Famous",
"Feedback",
"Low Lights"
]
},
{
"title": "Babel",
"artist": "Mumford & Sons",
"price": 13.83,
"release": "09/21/2012",
"quantity": 16,
"subtotal": 235.11,
"tracklisting": [
"I Will Wait",
"Lover of the Light",
"Whispers in the Dark",
"Babel"
]
},
{
"title": "True",
"artist": "Avicii",
"price": 15.99,
"release": "09/13/2013",
"quantity": 10,
"subtotal": 175.89000000000001,
"tracklisting": [
"Wake Me Up",
"You Make Me",
"Hey Brother",
"Lay Me Down"
]
}
]
}
If you just want to dump the contents of the created object to console, then it's not much of a js problem, but more of dealing with quirks of the console you're using... E.g. some consoles collapse nested objects.
In most cases you can dump the objects to string and output that, it's a good debugging aproach (which additionally gives you a view of an object from the time of the console call execution, not a reference to an object that might change later):
JSON.stringify(albums);
so in typical console call:
console.log(JSON.stringify(albums));
Looping through the album instances tracklisting property manually, you can get the individual items:
// Loop over the albums array
for(var i = 0; i < albums.length; ++i){
// Loop through the tracklisting array elements for the current album
for(var x = 0; x < albums[i].tracklisting.length; ++x){
console.log(albums[i].tracklisting[x]);
}
}
But, how about:
var albumString = JSON.stringify(albums);
console.log(albumString);
To simply turn the entire object structure into a string?

Add new attribute to an existing JSON inside FOR loop

I am trying to populate bootstrap-carousel with some more detailed JSON file from database.I am adding JSON details for the sake of detailed understanding. Earlier My JSON file was :
old.json
[
{"screen": [{
"img" : "../static/images/product/34.jpg",
"price": "Rs 100",
"href": "#mobile/1234"
},{
"img": "../static/images/product/34.jpg",
"price": "Rs 101",
"href":"#mobile/1234"
},{
"img":"../static/images/product/34.jpg",
"price": "Rs 102",
"href":"#mobile/1234"
},{
"img":"../static/images/product/34.jpg",
"price": "Rs 103",
"href":"#mobile/1234"
}
]},
{"screen": [{
"img" : "../static/images/product/34.jpg",
"price": "Rs 100",
"href": "#mobile/1234"
},{
"img": "../static/images/product/34.jpg",
"price": "Rs 101",
"href":"#mobile/1234"
},{
"img":"../static/images/product/34.jpg",
"price": "Rs 102",
"href":"#mobile/1234"
},{
"img":"../static/images/product/34.jpg",
"price": "Rs 103",
"href":"#mobile/1234"
}
]}
]
Now, I am trying to populate it with some more detailed JSON file.
new.JSON
[
{
"sku": "d58a2ece-4387-41d0-bacb-c4b7935f8405",
"selectedQtyOptions": [],
"selectedSize": "",
"description": "obviate buffoonery exterminating knave uncertainly engulf radiantly dogmatist squadron overcame refinance mopes pastier microphone awaiting begin extinguish plenty prod antecedent holdout schoolmarms Rush Kurosawa clinic Broadways Brie sunnier drove ermine husk gendarme vizier Mithridates feast goggled phase purchasing savviest prologs emails resets admire kilotons maladjustment burns viscounts puked receive Tibetans classifications kneed filtration thorns supply bigness astigmatic butterier differential sensational modernistic Djakarta splint earplug boomed horticulture perishables chanticleers syndicated scantiest cantankerousness splashier variate gneiss permutations typeset protozoa wrangled lawbreakers rumbling describe acerbity revenged golfs stalwart stockading caricatures pannier unpleasant sitter rescinds hazing Burgess coastlines thieved encouragingly forefinger Walpole achieving began spec diabetes Lichtenstein hickory squanders borne compute required bringing remunerative Oreo Pekingeses visualized sociopaths radicals flowerier Pakistan terse fillets barking causes Casey manpower ram glamourize deserves Steuben privatized waterproofs ridding poisons discredits overlong coquettes lichees proclivity floating thousandth Linwood promenading mushroomed stain strode obtusest transiency buckets vanguards straying castigate fathom Sappho restricting rehabilitation restiveness pattered bluest box lacquer noticeably Douro overdone biennially diodes baroque hesitant cleaving corroborates reminiscing disks abundant seven used peremptory employment matchbook fraternizing marigold Diaz vaporizers uncork Royal quick absurder misanthropic nabob blindfolds contemplatives Poincaré Galapagos Willamette punctilious Concord Othello carpal leanness Viacom snorkelers arcs piggybacking pulverized",
"selectedQty": "1",
"title": "dibble",
"brand": "Brand7",
"images": [
{
"image0": "/media/products/9f9734f60620cb52246e9e995b75a9bb.jpg"
}
],
"sizeQtyPrice": [
{
"discountAttributes": "upraised saline frowzy rails clampdown Geritol answer devoutest pressure silky",
"measureUnit": "ltr",
"discountPercent": 3,
"mrp": 8472,
"qty": 6,
"size": 99
},
{
"discountAttributes": "servers ambitiousness billeted brutalized moonstone clerestory Pole hamlet Shelton testaments",
"measureUnit": "ltr",
"discountPercent": 20,
"mrp": 2477,
"qty": 4,
"size": 19
},
{
"discountAttributes": "reeducated schmaltz gnashes marketplaces spill gazetteer bethinks preheats duel parley",
"measureUnit": "gms",
"discountPercent": 13,
"mrp": 6162,
"qty": 9,
"size": 86
}
],
"id": 1
},
{
"sku": "b8ea355d-7acc-455b-a55c-027b0e5c73cd",
"selectedQtyOptions": [],
"selectedSize": "",
"description": "Krasnodar karats northeasters libertarian aromatherapy badly partings sexpot rectangular Pyrenees yeshivahs gybe hollowness attune reuse Alphard Chilean johns Clydesdale acronym marmots itched proposer lushes hush combinations Latino weeps starches Hinayana firmware gamy society gaggle mast ginseng sordidness spiritualist sacking southern niceties grunting oblation arbor measures hobo measured iPad respites rutting sickened Baylor torturers malingers deferring expurgations tighter tenderfoot upload hosteling Apollonian upscale wraps Suzhou bookworm clarioning Ismail filthiest arborvitae descender accountant rendezvousing Didrikson mesquite sedating warlocks whips filigrees skylarking wallet refill inveighs thatch toffees recognizable Nazca foresails clangor eliminate crapped gourds impinges relinquishing duh drizzliest false uncommitted exhibited inhalation fomented crestfallen Bacall Darwinism Laurel gays peter undiluted showoff groceries sleeting immaturity Barclay whimpered Madeleine typhoons afforesting Theodoric beaching Decker merriness cultures luggage subscriptions Thomas map stun lengths Jackie offshoot Condorcet squirting upholstering amber statures unmanning snuck expatriates Gethsemane mongeese rocket reappearances Mantle marinading grotto twinkled stonewalling intermarried yoga vassal magnums parking convening Senecas sculled crimps undisciplined Montoya matchstick Sarah scissors intellects replay Rover seduce forage land Platonic wafer medicinal wooding Cumberland ravishing plummeting bantam choking rhizome Wei skyrocketed tempting concretely Siberia boxed heliotropes crummy alliteration reappears Budweiser lecher blunts supplications perspiring corrective military scurvy so monitoring tossed thymi saprophyte riverbed",
"selectedQty": "1",
"title": "nark",
"brand": "Brand2",
"images": [
{
"image0": "/media/products/2f08f1c38a7b67956e4f9295b6898f36.jpg"
}
],
"sizeQtyPrice": [
{
"discountAttributes": "towns Emily chafing boozers secrete confidentially primitively hospices disarrange misplaces",
"measureUnit": "gms",
"discountPercent": 8,
"mrp": 9942,
"qty": 8,
"size": 67
},
{
"discountAttributes": "amateurish tribune luxuriates staged severity Mia spices Muenster coercion obscure",
"measureUnit": "ml",
"discountPercent": 18,
"mrp": 3104,
"qty": 8,
"size": 43
},
{
"discountAttributes": "hanger hassling misanthropists scary dimly economists Moslem castaway Elam initiative",
"measureUnit": "gms",
"discountPercent": 17,
"mrp": 6260,
"qty": 6,
"size": 72
}
],
"id": 2
},
{
"sku": "7e46f4b1-a083-4eab-8d41-ac594202bd8f",
"selectedQtyOptions": [],
"selectedSize": "",
"description": "avails leg whisking lamaseries rebuilding syllabifying clammiest pretense redcap bellying healthy spaghetti Velveeta shares refunding yellowed danced Peking Darrin pigging illegibly foreign utterly Shakespearean trammelling reports Moran tab okra yipped motorcyclists sweetheart sickbed Serb disgorging Sawyer the incinerator selects each reheats declaimed equestriennes Rolvaag membrane tinselled propagation sighs engraved spookier splurged neuters impersonator Gloucester condemnatory adumbrate citadels Iaccoca mishandled clamming scurries militancy interviewing seized mestizoes lithe Marrakesh isolationism antimatter gossip humanitarians combated tease battering idlers sunset Quaternary striving pattern Brandon heart upended barbiturate overtakes pendant tripe doomsday pejoratives paltriness share tadpoles warming intern fluorides Arawakan honcho sleepiness incorporates typesetters alphabetizes violinists Flanders publicist informer deathbed getaways Iyar Decca schmoozing Tricia ultrasound debugging trepidation suspenseful scrapping rubies exorcized riffling vasectomy tolled bootblack Lott balking PhD hitched utter reprehends snorkel dodges deck dynamical planting conspicuously mottoes totality bedecking bachelor wooed mummification risks Chase weatherproof pear backboard Lieberman fisherman propositional swig ruminants Deena pastiche snob overshadowing spinet apostasy immigrated weighing Christie upraised accruals amphitheatre southwester bulldogs Caracas Trajan primly snowsuit bottomed Woolworth predate biking drill japans potholders uncommon swagging oversteps appositive razing helixes ninetieths prohibitory careered Costello musketeers orator pothooks dumfound express hopelessly franchisers blames semimonthlies transformers histogram radiator canes photoelectric pelves bruised",
"selectedQty": "1",
"title": "Harare",
"brand": "Brand8",
"images": [
{
"image0": "/media/products/2f08f1c38a7b67956e4f9295b6898f36_btZCYFi.jpg"
}
],
"sizeQtyPrice": [
{
"discountAttributes": "deters pyrite excitement Australian wadi protagonists bumpiest Caxton bundling monotony",
"measureUnit": "ltr",
"discountPercent": 5,
"mrp": 9355,
"qty": 1,
"size": 80
},
{
"discountAttributes": "puppies smudge moderator constellations invasion Asgard goggle compendiums atrophy tents",
"measureUnit": "Kg",
"discountPercent": 7,
"mrp": 4183,
"qty": 2,
"size": 19
},
{
"discountAttributes": "jailer allotting kindness veers Moss invalidation Brahmanism xenophobia warmhearted looping",
"measureUnit": "ml",
"discountPercent": 16,
"mrp": 1956,
"qty": 1,
"size": 33
}
],
"id": 3
},
{
"sku": "d1cd71a8-9dc5-4724-b269-473ede28a1d7",
"selectedQtyOptions": [],
"selectedSize": "",
"description": "foolish interpolates trumpet monographs ferried inboards Forster tike grammatically sunroof vaporizing Sweden demure retouching completely robbing readies unloose guiltless tatty unobservant cuffs fortieth wither rigorously paradoxically snowmobiling charts clenching planning dealing lesions bicameral pertly chaffinches grumpiness private purled insanely attainment proposal Fatima execrates pshaws chars actuators turboprop soughed kicking majors conquistadores Cynthia septuagenarians kneecaps titans attractions larvas invigorating trunking Shevat recluse Trina slenderness kinking falsified logistically hogged skyrocketing ordinal avoiding trademarked underfoot garter sacrificial pricey nosedive bachelors deiced heave dictatorial muffing prayed rewinding recopied limpidly Crichton conversion chitterlings signets Aiken Froissart turnoff snowshoe forded spiralled underwriters flourishes Sade splicer transfusions cesspools lifelike ruckus showering paean voguish Buck copings Russell watchdog magneto pored height zodiac motherland backings Venus obeys scooters nonintervention dinosaur unashamedly anathema hibernate consumerism portended worked mystically existentialist dissatisfies badgers unanimously triplicated Jenny sagacity Windex snoopier nonplusing shovelling Assam putty darn Sulawesi Italians gunnery codify develops rhinos upwards Louise welled experiences socks pinky mewed Camille claimants swirl squattest ware parenthetic bonitoes hydrangeas decolonizing omit skyjacks Gorky financiers province flywheel southeastward Bayeux updated yowl Tulsidas macintosh sprees pralines systolic uncommoner cilium tromping Asimov heinous cordoned combated camerawomen syndrome identified prizefights heavyweight vertically reflector integrity Hebrides sepulchral loner parrot smooths candidness",
"selectedQty": "1",
"title": "viragoes",
"brand": "Brand0",
"images": [
{
"image0": "/media/products/f791a316ced7b3b774bd61e138197224.jpg"
}
],
"sizeQtyPrice": [
{
"discountAttributes": "chinos theosophy misdemeanor irrigates school Pullman sombrely suspect vortex baddest",
"measureUnit": "ltr",
"discountPercent": 4,
"mrp": 3102,
"qty": 7,
"size": 66
},
{
"discountAttributes": "Molotov absurd traces pounces contracts clarions thighbone Hesse parricide constrains",
"measureUnit": "m",
"discountPercent": 16,
"mrp": 2773,
"qty": 7,
"size": 18
},
{
"discountAttributes": "detainment gunnysack vied expropriation unobtrusive collectables embracing poster hexing governess",
"measureUnit": "m",
"discountPercent": 6,
"mrp": 9920,
"qty": 6,
"size": 69
}
],
"id": 9
},
{
"sku": "838660bb-7ab9-4f2a-8be7-9602a5801756",
"selectedQtyOptions": [],
"selectedSize": "",
"description": "agreeing vizier bleariest trig appliquéing copulating commissariats Balzac lunchtimes glittery quacking Leoncavallo heehawing Tampax lizards pegged nanosecond centigrade subplots tumbrils give jawed skits nickel discontinues impinged evangelized Platonist waterlines dams symposiums intercessor cognition heavier softener dromedaries bravos immobilize consciously Clemons patch klutzier Kirkpatrick caddying designs Dulles twelfths undemocratic isolationists infected ma homering soliciting minibus pluralism fraternity catalyzed Scorpio pandemonium waxwing starter infuses rebuttals spirals rerunning interrogatories Manuel whomsoever tenderized conjoint baronesses callower parenthetic plusses extend cockier Fokker dewlap Cowper Swammerdam secs hock relaxations Judas Canadian presidency lo wildness Philippe picture beekeeper lull manuals transnational yaw chloroformed perennials distinctive Nottingham antiquaries underneath parted nervously basemen observatories scrubbed encoder egalitarians winnow caddish Hawaiians brownstones robbing exhaustible antagonist benefactresses Plasticine Peace platypi Guzman stippled shuts peacemakers butterfly Bolton grout McCain Lebanon bounce oleander Balkans endearments snowfall spoonerisms furnaces inequities billowy jutting guffaw beautifully penis newtons snuffboxes j Angelita tinkles literature depicts insouciant scribblers blinker disobediently devotees primordial sixties Kalamazoo shear contest classes cripple edging exactest cheat invocation thrived drunkenness Fuller architectures sprite Lillian constricts tucking chastisements walruses guzzlers rejoinder apprenticeships pillory spendthrift omens spoonful contortions precociously intensely motorway guts cahoot sculptor paralytics reminisce meltdown trusts lady pronghorn scurried Campbell micron flawing foals nigher",
"selectedQty": "1",
"title": "smokier",
"brand": "Brand2",
"images": [
{
"image0": "/media/products/f51a649e72694d23962ee77a97872f0e.jpg"
}
],
"sizeQtyPrice": [
{
"discountAttributes": "Beerbohm earldom Stanley seconding hypertension Sayers miserly epitome retires ditching",
"measureUnit": "m",
"discountPercent": 15,
"mrp": 5065,
"qty": 6,
"size": 83
},
{
"discountAttributes": "confine Newman bagel cornflower rears generator goaded midweeks drain cigarillo",
"measureUnit": "Kg",
"discountPercent": 12,
"mrp": 2284,
"qty": 9,
"size": 13
},
{
"discountAttributes": "eerier fizzes lessened rotisserie developer Gray industrial callused convergences ampoule",
"measureUnit": "gms",
"discountPercent": 4,
"mrp": 6816,
"qty": 8,
"size": 18
}
],
"id": 14
}
]
As you can see, I need to group my new.JSON as a group of 4 under screen attribute. For that I wrote one for loop:
mainApp.controller('MultiCarouselController', function($scope, $http) {
$scope.products = [];
$scope.Math = Math;
$http.get("/get_broad_category_products/?BroadCategory=BroadCategory3")
.success(function (response) {
$scope.products = response;
var iteratation = Math.ceil($scope.products.length/4);
var carouselJson = [];
for(var index = 0; index < iteratation; index++){ // kinda 2D matrix as [0,1],[0,2],[1,1],[1,2]
var temp = [];
for (var i = (index*4) ; i < (4*(index+1)) ; i++){
temp = temp.concat($scope.products[i]) // concatenating 4 JSON as a group
}
carouselJson.push(temp); // pushing group to new JSON
}
console.log(carouselJson);
}).error(function(){
console.log('Error happened ... ');
});
});
This angularJS controller is working completely fine, how can I add "screen" property and then add group of 4 JSONs to it
I though about doing something like:
for(var index = 0; index < iteratation; index++){ // kinda 2D matrix as [0,1],[0,2],[1,1],[1,2]
var temp = [];
for (var i = (index*4) ; i < (4*(index+1)) ; i++){
temp = temp.concat($scope.products[i]) // concatenating 4 JSON as a group
}
var jsTemp = [] ;
carouselJson.push(jsTemp.screen.push(temp)); // Errrrr.... screen property is not there in jsTemp. Now ????
}
Small help might do the trick !!!
I am not at all a fan of angular so do not know that much about how it handles JSON.
Yet JSON is just a serialized object and thus it is easy to mix and match as long as you take a few precautions.
Consider the following two json files. JSON1 is a list of products and each product has an id that is unique to that product. The second JSON JSON2 has amendments to the first JSON that have specific names "extraImages", "newItems", "updates", "newData" that we have to add to the first.
Concatenating them will not do as they are not arrays. nor can you just concat JSON strings, it does not work.
You could write a generic Object join function but that will join the two without any contextual knowledge. How does it know where to put extra images? how does it know that each product can be identified by the ID?
To join the two object we need to have pria knowledge of the data structures and the semantic meaning of each item in both files.
Anyways the two JSON files as string.
var JSON1 = `{
"item1":{
"id":100,
"desc":"a product",
"images":[
"img1.jpg",
"img2.jpg",
]
},
"item2":{
"id":101,
"desc":"another product",
"images":"img11.jpg", // this item has only one image so it just has a string
},
"item5":{
"id":105,
"desc":"a product without images",
},
}`;
var JSON2 = `{
"extraImages":[{
"id":101,
"images":[
"imageA.png",
"imageC.png"
]
}],
"newData":[{
"id":100,
"price":100,
}
],
"update":[{
"id":100,
"desc":"Best buy product",
}
],
"newItems":[{
"item3":{
"id":102,
"desc":"Just on the docks",
"images":[
"Blury11.jpg",
]
},
}
}`
So as strings JSON is kind of useless. To hard to search and find data. So JavaScript has a built in object to handle JSON called funnily enough JSON
The JSON object has two methods JSON.stringify(Obj) and JSON.parse(String)
JSON.stringify takes a basic JS data type and converts it into a
JSON string.
JSON.parse takes a json string, from whatever source and converts
it back into a JS Object, Array...
So first step convert both JSON string to objects.
var items = JSON.parse(JSON1);
var extras = JSON.parse(JSON2);
Now we have two normal JS objects that we can manipulate and join.
Lets do the images. The extra images are an array, with each item having an ID and an array of image names.
// we know the name of the object that has extra images so check if its there
// and then itterate all the items in the array
if(extras.extraImages !== undefined){ // Does this property exist
extras.extraImages.forEach(function(item){ // itterat over each item
var arrayOfImages;
// do the images exist and if so are they as an array
if(item.images !== undefined && typeof item.images === "array"){
arrayOfImages = item.images;
}
// the data structure may vary depending on what is serving the JSON
// data so you can add code to take differing types
// Now to find the matching item in the items object
// check that there is an array of images to add and tha
// the item we have has an item id we can use to find the existing item
if(arrayOfImages !== undefined && item.id !== undefined){
// continue on further down
So we have found an extra images item that has an ID and array of image names. We need to find the product if it exists that has that ID. As we will do that many times lets write a function to do that.
// pass the items object that may contain the item with the ID we are looking for
function getItemById(items,id){
for(var itemName in items){ // iterate each named item. itemName is
// just a variable it could be any var name.
// It contains a string holding each enumerable
// properties name in turn
Now check that the named property has a id you may be tempted to check if the id has the id we are looking for.
if(item[itemName].id === id){
This will throw an error if the item does not have an id and there are many reasons an enumerable property may appear that is not correctly structured. So check id exists then check its value. Unlike C/C++/C# the order of comparisons is always left to right. At the first false the if( will drop out of the () and not do any further comparison.
It is thus safe in javascript to test for the second condition as long as you test first that it will not throw ReferenceError: id is not defined
if(items[itemName].id !== undefined && items[itemName].id == id){
will never throw an error while
if(items[itemName].id == id && items[itemName].id !== undefined ){
can if id does not exist.
Anyways I diverge.
if(items[itemName].id == id && items[itemName].id !== undefined ){
// found the item with matching id
return items[itemName]; // so return it
}
}
return undefined; // nothing found that matches so return undefined
} //end of function
So back to adding extra images. We have just tested and found a extraimage item with an id and some extra image names.
// use the function to get the item
var existingItem = getItemById(items,item.id);
// check that we found one
if(existingItem !== undefined){
// check to see if it has a images
if(existingItem.images === undefined){
// no image so creat images and add an empty array
existingItem.images = []
}else // if it does is it an array
if(typeof existingItem.images !== "array"){
// not an array we will assume what is there
// is an image description of some type
// so convert the existing images object into
// an array and add the existing item into it
existingItem.images = [existingItem.images];
}
// now we are sure the images array is correct so lets
// add the new images to i
existingItem.images existingItem.images.concat( arrayOfImages);
}
}
}); // end of forEach lop
} // endo of adding new images
So wrap it all up
// code to join extraImages to items
if(extras.extraImages !== undefined){
extras.extraImages.forEach(function(item){
var arrayOfImages;
if(item.images !== undefined && typeof item.images === "array"){
arrayOfImages = item.images;
}
if(arrayOfImages !== undefined && item.id !== undefined){
var existingItem = getItemById(items,item.id);
if(existingItem !== undefined){
if(existingItem.images === undefined){
existingItem.images = []
}else
if(typeof existingItem.images !== "array"){
existingItem.images = [existingItem.images];
}
existingItem.images existingItem.images.concat( arrayOfImages);
}
}
});
}
// was going to show all the other joins for extras.update, newItems, and newData
// too much for one answer.
I see this is becoming a long answer. I'll assume that you see what is being done and how that is used to join two objects together while conforming to its semantic meaning. You should be able to write a function to do the same for your data. Convert both JSON strings to object via JSON.parse iterate the object structure obeying the semantic meaning of the data, creating or appending data as needed.
The last thing, as I assume you need the joined data as JSON string, is to convert the updated object back into a json string.
JSON1 = JSON.stringify(items); // convert the updated items object to a JSON string
Now you can pass it on back to Angular's JSON abstraction layer to do what you need.
Hope this helps. And maybe there is a way in Angular but as no one has answered with what is needed and I don't want to sully my purist ways (yucky Angular), this will give you some extra JS grounding and allow you to fix your problem.
If I am reading this correctly, you want a new property to be added to each element inside the temp array. For this you can try creating a new object from your $scope.products[i].
for(var index = 0; index < iteratation; index++){ // kinda 2D matrix as [0,1],[0,2],[1,1],[1,2]
var temp = [];
for (var i = (index*4) ; i < (4*(index+1)) ; i++){
var destObj = $scope.products[i];
destObj.screen = 'xx' // Assign your value here.
temp = temp.concat(destObj) // concatenating 4 JSON as a group
}
carouselJson.push(temp);
}
Hope this helps...
this linked helped me
JavaScript Array Push key value
changed my loop like:
var carouselJson = [];
for(var index = 0; index < iteratation; index++){ // kinda 2D matrix as [0,1],[0,2],[1,1],[1,2]
var temp = [];
var screen = ['screen'];
var obj = {};
for (var i = (index*4) ; i < (4*(index+1)) ; i++){
temp = temp.concat($scope.products[i]); // concatenating 4 JSON as a group
}
obj[screen]=temp;
carouselJson.push(obj); // pushing group to new JSON
}
$scope.mCarousels = carouselJson;

Categories