Skip to content

Commit

Permalink
perf(okam-core): optimize array splice operation
Browse files Browse the repository at this point in the history
  • Loading branch information
wuhy committed Dec 19, 2018
1 parent 4032eaf commit 6f30d48
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 5 deletions.
18 changes: 13 additions & 5 deletions packages/okam-core/src/extend/data/observable/array.js
Expand Up @@ -58,12 +58,20 @@ export const observableArray = {

splice(observer, rawSplice, ...args) {
let rawData = observer.rawData;
rawSplice.apply(rawData, args);

let result = rawSplice.apply(this, args);
observer.set(null, rawData);

return result;
if (args.length === 3 && args[1] === 1) {
// splice(idx, 1, newValue) is the same as arr[idx] = newValue
let delIdx = args[0];
let lastIdx = rawData.length - 1;
let upIdx = delIdx > lastIdx ? (lastIdx + 1) : delIdx;
observer.set(upIdx, args[2]);
}
else {
rawSplice.apply(rawData, args);
observer.set(null, rawData);
}

return rawSplice.apply(this, args);
},

sort(observer, rawSort, ...args) {
Expand Down
38 changes: 38 additions & 0 deletions packages/okam-core/test/tasks/extend/data/observable/array.spec.js
Expand Up @@ -6,18 +6,24 @@
'use strict';

/* eslint-disable babel/new-cap */
/* global before:false */

import assert from 'assert';
import expect, {createSpy} from 'expect';
import MyApp from 'core/swan/App';
import {clearBaseCache} from 'core/helper/factory';
import observable from 'core/extend/data/observable';
import {fakeComponent, fakeAppEnvAPIs} from 'test/helper';
import {resetObservableArray} from './helper';

describe('observable array', function () {
let MyComponent;
let restoreAppEnv;

before('init observable array', function () {
resetObservableArray();
});

beforeEach('init global App', function () {
clearBaseCache();

Expand Down Expand Up @@ -280,6 +286,38 @@ describe('observable array', function () {
});
});

it('should using array index to update when splice call has three args', function (done) {
MyApp.use(observable);
let instance = MyComponent({
data: {
a: [67, 12]
}
});

let spySetData = createSpy(() => {});
instance.setData = spySetData;

instance.created();
let result = instance.a.splice(1, 1, 23);
expect(result).toEqual([12]);
expect(instance.a).toEqual([67, 23]);
expect(instance.a).toEqual(instance.data.a);

result = instance.a.splice(6, 1, 54);
expect(result).toEqual([]);
expect(instance.a).toEqual([67, 23, 54]);
expect(instance.a).toEqual(instance.data.a);

setTimeout(() => {
expect(spySetData).toHaveBeenCalled();
assert(spySetData.calls.length === 1);
expect(spySetData.calls[0].arguments[0]).toEqual(
{'a[1]': 23, 'a[2]': 54}
);
done();
});
});

it('should shift array', function (done) {
MyApp.use(observable);
let instance = MyComponent({
Expand Down

0 comments on commit 6f30d48

Please sign in to comment.