Skip to content

Commit 690eb95

Browse files
committed
clean up keyedContainer for possibly missing array
1 parent 5e9aa65 commit 690eb95

File tree

2 files changed

+65
-6
lines changed

2 files changed

+65
-6
lines changed

src/lib/keyed_container.js

+20-6
Original file line numberDiff line numberDiff line change
@@ -33,32 +33,44 @@ var UNSET = 4;
3333
module.exports = function keyedContainer(baseObj, path, keyName, valueName) {
3434
keyName = keyName || 'name';
3535
valueName = valueName || 'value';
36-
var i, arr;
36+
var i, arr, baseProp;
3737
var changeTypes = {};
3838

39-
if(path && path.length) { arr = nestedProperty(baseObj, path).get();
39+
if(path && path.length) {
40+
baseProp = nestedProperty(baseObj, path);
41+
arr = baseProp.get();
4042
} else {
4143
arr = baseObj;
4244
}
4345

4446
path = path || '';
45-
arr = arr || [];
4647

4748
// Construct an index:
4849
var indexLookup = {};
49-
for(i = 0; i < arr.length; i++) {
50-
indexLookup[arr[i][keyName]] = i;
50+
if(arr) {
51+
for(i = 0; i < arr.length; i++) {
52+
indexLookup[arr[i][keyName]] = i;
53+
}
5154
}
5255

5356
var isSimpleValueProp = SIMPLE_PROPERTY_REGEX.test(valueName);
5457

5558
var obj = {
56-
// NB: this does not actually modify the baseObj
5759
set: function(name, value) {
5860
var changeType = value === null ? UNSET : NONE;
5961

62+
// create the base array if necessary
63+
if(!arr) {
64+
if(!baseProp || changeType === UNSET) return;
65+
66+
arr = [];
67+
baseProp.set(arr);
68+
}
69+
6070
var idx = indexLookup[name];
6171
if(idx === undefined) {
72+
if(changeType === UNSET) return;
73+
6274
changeType = changeType | BOTH;
6375
idx = arr.length;
6476
indexLookup[name] = idx;
@@ -86,6 +98,8 @@ module.exports = function keyedContainer(baseObj, path, keyName, valueName) {
8698
return obj;
8799
},
88100
get: function(name) {
101+
if(!arr) return;
102+
89103
var idx = indexLookup[name];
90104

91105
if(idx === undefined) {

test/jasmine/tests/lib_test.js

+45
Original file line numberDiff line numberDiff line change
@@ -1742,6 +1742,51 @@ describe('Test lib.js:', function() {
17421742
});
17431743

17441744
describe('keyedContainer', function() {
1745+
describe('with no existing container', function() {
1746+
it('creates a named container only when setting a value', function() {
1747+
var container = {};
1748+
var kCont = Lib.keyedContainer(container, 'styles');
1749+
1750+
expect(kCont.get('name1')).toBeUndefined();
1751+
expect(container).toEqual({});
1752+
1753+
kCont.set('name1', null);
1754+
expect(container).toEqual({});
1755+
1756+
kCont.set('name1', 'value1');
1757+
expect(container).toEqual({
1758+
styles: [{name: 'name1', value: 'value1'}]
1759+
});
1760+
expect(kCont.get('name1')).toBe('value1');
1761+
expect(kCont.get('name2')).toBeUndefined();
1762+
});
1763+
});
1764+
1765+
describe('with no path', function() {
1766+
it('adds elements just like when there is a path', function() {
1767+
var arr = [];
1768+
var kCont = Lib.keyedContainer(arr);
1769+
1770+
expect(kCont.get('name1')).toBeUndefined();
1771+
expect(arr).toEqual([]);
1772+
1773+
kCont.set('name1', null);
1774+
expect(arr).toEqual([]);
1775+
1776+
kCont.set('name1', 'value1');
1777+
expect(arr).toEqual([{name: 'name1', value: 'value1'}]);
1778+
expect(kCont.get('name1')).toBe('value1');
1779+
expect(kCont.get('name2')).toBeUndefined();
1780+
});
1781+
1782+
it('does not barf if the array is missing', function() {
1783+
var kCont = Lib.keyedContainer();
1784+
kCont.set('name1', null);
1785+
kCont.set('name1', 'value1');
1786+
expect(kCont.get('name1')).toBeUndefined();
1787+
});
1788+
});
1789+
17451790
describe('with a filled container', function() {
17461791
var container, carr;
17471792

0 commit comments

Comments
 (0)