feat: Support nested locale keys.

Example:

```js
{
  model: {
    user: {
      name: 'Real Name',
      createdAt: 'Joined At'
    }
  }
}
```

```js
ctx.__('model.user.name');
ctx.__('model.user.createdAt');
```

The before:

```js
{
  'model.user.name': 'Real Name',
  'model.user.createdAt', 'Joined At'
}
```

Benchmarks:

```
Deeps:  9
  2 tests completed.

  direct read a key x 85,993,593 ops/sec ±1.89% (96 runs sampled)
  by nested         x  4,203,837 ops/sec ±0.98% (93 runs sampled)
```
This commit is contained in:
Jason Lee
2015-09-17 18:20:10 +08:00
parent 1c347630f1
commit 58324a11ff
6 changed files with 193 additions and 3 deletions

134
benchmark/nested-value.js Normal file
View File

@@ -0,0 +1,134 @@
var Benchmark = require('benchmark');
var benchmarks = require('beautify-benchmark');
var suite = new Benchmark.Suite();
function getNestedValue(data, key) {
var keys = key.split('.');
for (var i = 0; typeof data === 'object' && i < keys.length; i++) {
data = data[keys[i]];
}
return data;
}
var resource = {
'model.user.foo.bar.aa': 'Hello',
model: {
user: {
fields: {
name: 'Real Name',
age: 'Age',
a: {
b: {
c: {
d: {
e: {
f: "fff"
}
},
model: {
user: {
fields: {
name: 'Real Name',
age: 'Age',
a: {
b: {
c: {
d: {
e: {
f: "fff"
}
}
}
}
}
}
},
post: {
fields: {
title: 'Subject'
}
}
}
}
}
}
},
model: {
user: {
fields: {
name: 'Real Name',
age: 'Age',
a: {
b: {
c: {
d: {
e: {
f: "fff"
}
}
}
}
}
}
},
post: {
fields: {
title: 'Subject'
}
}
}
},
post: {
fields: {
title: 'Subject'
}
},
model: {
user: {
fields: {
name: 'Real Name',
age: 'Age',
a: {
b: {
c: {
d: {
e: {
f: "fff"
}
}
}
}
}
}
},
post: {
fields: {
title: 'Subject'
}
}
}
}
};
var fullKey = 'model.user.fields.a.b.c.d.e.f';
console.log('Deeps: ', fullKey.split('.').length);
// console.log('getNestedValue:', getNestedValue(resource, fullKey));
suite
.add('direct read a key', function() {
resource['model.user.foo.bar.aa'];
})
.add('by nested', function() {
getNestedValue(resource, fullKey);
})
.on('cycle', function(event) {
benchmarks.add(event.target);
})
.on('complete', function done() {
benchmarks.log();
})
.run({ async: false });