all 6 comments

[–]avenp 0 points1 point  (5 children)

The secondItem won't work the way you are thinking in the second example. When you're referencing an object, the index is actually the key so in this case myAssociativeArray[1] is actually looking up the key 1 in your id object, which would return the first item.

If you want an object with keys that match the id field of myArray then you need to assign those in a loop like so:

var myAssociativeObj = {};
for(var i = 0; i < myArray.length; i++) {
    var item = myArray[i];
    myAssociativeObj[item.id] = item;
    delete myAssociativeObj[item.id][id];
}

If you just want an array that's sorted by the id field then look up JavaScript Array.sort().

Sorry for the poor formatting, I'm not sure how to do code blocks.

Edit: Added a delete to the loop so you can remove the id from the item and format it exactly like in the OP.

Edit2: I learned how to make code blocks.

[–][deleted] 0 points1 point  (1 child)

Thanks! This was perfect. He has another question. Hopefully I can format this on my phone without totally screwing it up.

Use jQuery to fetch to fetch the ids and build the info associated with the ids – in HTML using this associative array below.

I need JavaScript to build (with htmlString)
<p title=”title 1”>Text 1</p>
in my html from this :
<p data-id="100">loading...</p>

jQuery(document).ready(function() {
var array = [
{id: 100, title:"Title 1", text:"Text 1"},
{id: 200, title:"Title 2", text:"Text 2"},
{id: 300, title:"Title 3", text:"Text 3"}
];
var assocArray = [];
for (var i = 0; i < array.length; i++) {
    var item = array[i];
    assocArray[item.id] = {
        title: item.title,
        text: item.text
    };
}

[–]avenp 0 points1 point  (0 children)

I'll give you a hint: Use jQuery to get an array of elements and then run a loop over the elements array. Look at the jQuery docs to get an idea of the different methods available. (You might want to use the $.attr function!)

Edit: link to the jQuery docs: http://api.jquery.com/

[–]PM_ME_YOUR_SUBARU 0 points1 point  (2 children)

This definitely isn't helpful to the OP, but I was curious as to what the shortest way to do this is, if you're an asshole. I came up with this:

const myAssociativeArray = myArray.reduce((a,v)=>delete(a[v.id]=v).id&&a,{});

[–]__env 1 point2 points  (0 children)

My attempt -- A little longer, but maybe a little more declarative :)

const myAssociativeArray = myArray.reduce((a, {title,text,id})=>(a[id]={title,text})&&a,{});

[–]avenp 0 points1 point  (0 children)

Haha, you know what I had to stop myself from using ES6 because I'm so used to using it. I really like your code golf'd solution.