Skip to content

Commit

Permalink
Account for duplicate values in an array
Browse files Browse the repository at this point in the history
  • Loading branch information
janechu committed Jan 24, 2025
1 parent aa60ff4 commit 4a4f5b0
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 14 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -140,10 +140,10 @@ describe("The ArrayObserver", () => {
const array = [1, 2, 3, 4];
array.reverse();

expect(array).members([4, 3, 2, 1]);
expect(array).ordered.members([4, 3, 2, 1]);

Array.prototype.reverse.call(array);
expect(array).members([1, 2, 3, 4]);
expect(array).ordered.members([1, 2, 3, 4]);

const observer = Observable.getNotifier<ArrayObserver>(array);
let changeArgs: Sort[] | null = null;
Expand All @@ -155,7 +155,7 @@ describe("The ArrayObserver", () => {
});

array.reverse();
expect(array).members([4, 3, 2, 1]);
expect(array).ordered.members([4, 3, 2, 1]);

await Updates.next();

Expand All @@ -170,7 +170,7 @@ describe("The ArrayObserver", () => {
);
changeArgs = null;
array.reverse();
expect(array).members([1, 2, 3, 4]);
expect(array).ordered.members([1, 2, 3, 4]);

await Updates.next();

Expand Down Expand Up @@ -227,15 +227,15 @@ describe("The ArrayObserver", () => {

it("observes sorts", async () => {
ArrayObserver.enable();
let array = [1, 3, 2, 4];
let array = [1, 3, 2, 4, 3];

array.sort((a, b) => b - a);
expect(array).members([4, 3, 2, 1]);
expect(array).ordered.members([4, 3, 3, 2, 1]);

Array.prototype.sort.call(array, (a, b) => a - b);
expect(array).members([1, 2, 3, 4]);
expect(array).ordered.members([1, 2, 3, 3, 4]);

array = [1, 3, 2, 4];
array = [1, 3, 2, 4, 3];
const observer = Observable.getNotifier<ArrayObserver>(array);
let changeArgs: Sort[] | null = null;

Expand All @@ -246,7 +246,7 @@ describe("The ArrayObserver", () => {
});

array.sort((a, b) => b - a);
expect(array).members([4, 3, 2, 1]);
expect(array).ordered.members([4, 3, 3, 2, 1]);

await Updates.next();

Expand All @@ -255,6 +255,7 @@ describe("The ArrayObserver", () => {
[
3,
1,
4,
2,
0
]
Expand Down
15 changes: 10 additions & 5 deletions packages/web-components/fast-element/src/observation/arrays.ts
Original file line number Diff line number Diff line change
Expand Up @@ -700,18 +700,23 @@ let defaultMutationStrategy: SpliceStrategy = Object.freeze({
): any[] {
const map = new Map();

for (let i = 0, ii = (array || []).length; i < ii; ++i) {
map.set(array[i], i);
for (let i = 0, ii = array.length; i < ii; ++i) {
const mapValue = map.get(array[i]) || [];

map.set(array[i], [...mapValue, i]);
}

const result = sort.apply(array, args);

(array as any).sorted++;

const sortedItems: number[] = [];
for (let i = 0, ii = (array || []).length; i < ii; ++i) {
const newIndex = map.get(array[i]);
sortedItems.push(newIndex);

for (let i = 0, ii = array.length; i < ii; ++i) {
const indexs = map.get(array[i]);
sortedItems.push(indexs[0]);

map.set(array[i], indexs.splice(1));
}

observer.addSort(new Sort(sortedItems));
Expand Down

0 comments on commit 4a4f5b0

Please sign in to comment.