I’m dealing with immutable objects.
I sort data by thisweekNumber
as you can see below.
data.sort(function (a, b) { return b.thisweekNumber - a.thisweekNumber; })
For exmaple,
data = [ {name: A, thisweekNumber: 3}, {name: B, thisweekNumber: 5}, {name: C, thisweeknumber: 1}, {name: D, thisweekNumber: 4} {name: E, thisweekNumber: 4} ]
I sort them B -> D -> E -> A -> C
So I want to put Index to them in this order:
data = [ {name: A, thisweekNumber: 3, index: 3}, {name: B, thisweekNumber: 5, index: 1}, {name: C, thisweeknumber: 1, index: 4}, {name: D, thisweekNumber: 4, index: 2} {name: E, thisweekNumber: 4, index: 2} ]
BUT here, I want to recognize same thisweekNumber of D and E.
Since they both have 4.
So Index will be like above.
How can I make this array in JavaScript
?
Advertisement
Answer
The simplest thing I can think of is to do it after sorting, with a simple loop:
let index = 1; for (let n = 0; n < data.length; ++n) { const current = data[n]; current.index = index; // See if the next one (if any) matches this one if (data[n + 1]?.thisweekNumber !== current.thisweekNumber) { ++index; } }
const data = [ { name: "A", thisweekNumber: 3 }, { name: "B", thisweekNumber: 5 }, { name: "C", thisweeknumber: 1 }, { name: "D", thisweekNumber: 4 }, { name: "E", thisweekNumber: 4 }, ]; data.sort(function (a, b) { return b.thisweekNumber - a.thisweekNumber; // return b.thisweekFeedNumber - a.thisweekFeedNumber; }); let index = 1; for (let n = 0; n < data.length; ++n) { const current = data[n]; current.index = index; // See if the next one (if any) matches this one if (data[n + 1]?.thisweekNumber !== current.thisweekNumber) { ++index; } } console.log(data);
.as-console-wrapper { max-height: 100% !important; }
Note the use of optional chaining in the if
.
In a comment you’ve said:
thanks i understand the concept ! but my object seems not extensible in the process ‘current.index = index’. erorr says : cannot add property index, object is not extensible.
You didn’t mention that in the question. If you’re dealing with immutable objects, you’ll need to create new objects (probably in a new array). Creating the objects is typically done using spread syntax:
const newObject = { ...oldObject, newProperty: "new value" };
You can easily do that in the loop above, pushing to an in-scope array:
const data = [ { name: "A", thisweekNumber: 3 }, { name: "B", thisweekNumber: 5 }, { name: "C", thisweeknumber: 1 }, { name: "D", thisweekNumber: 4 }, { name: "E", thisweekNumber: 4 }, ]; data.sort(function (a, b) { return b.thisweekNumber - a.thisweekNumber; // return b.thisweekFeedNumber - a.thisweekFeedNumber; }); let index = 1; const result = []; for (let n = 0; n < data.length; ++n) { const current = data[n]; result.push({ ...current, index, }); // See if the next one (if any) matches this one if (data[n + 1]?.thisweekNumber !== current.thisweekNumber) { ++index; } } console.log(result);
.as-console-wrapper { max-height: 100% !important; }
…or via map
:
const data = [ { name: "A", thisweekNumber: 3 }, { name: "B", thisweekNumber: 5 }, { name: "C", thisweeknumber: 1 }, { name: "D", thisweekNumber: 4 }, { name: "E", thisweekNumber: 4 }, ]; data.sort(function (a, b) { return b.thisweekNumber - a.thisweekNumber; // return b.thisweekFeedNumber - a.thisweekFeedNumber; }); let index = 1; const result = data.map((current, n) => { const element = { ...current, index, }; // See if the next one (if any) matches this one if (data[n + 1]?.thisweekNumber !== current.thisweekNumber) { ++index; } return element; }); console.log(result);
.as-console-wrapper { max-height: 100% !important; }
The map
version is probably more idiomatic.