function fVal(test, alt) {
return test !== -1 ? test : alt;
}
function getLookupKey() {
var arr = Array.prototype.slice.call(arguments),
length = arr.length,
begin = fVal(arr.findIndex(Boolean), length),
end = length - fVal(arr.slice().reverse().findIndex(Boolean), 0);
arr = arr.slice(begin, end);
if (!arr.every(Boolean)) {
throw new SyntaxError('middle evaluates false');
}
return arr.join('.');
}
function log(str) {
document.getElementById('out').textContent += str + '\n';
}
var tests = [
[
[null, 'middle'], 'middle'],
[
[null, null, null, 'middle', null, null], 'middle'],
[
[null, null, 'middle', null, null, null], 'middle'],
[
['prefix1', 'prefix2', 'middle', 'suffix1', 'suffix2'], 'prefix1.prefix2.middle.suffix1.suffix2'],
[
[null, 'prefix', 'middle', 'suffix', null], 'prefix.middle.suffix'],
[
['name'], 'name'],
[
[null], ''],
[
[null, null, null, null], ''],
[
['a', null, null, null], 'a'],
[
[null, null, null, 'b'], 'b'],
[
[], ''],
[
['prefix', null, 'suffix'], Error],
[
[null, null, 'a', 'b', 'c', null, null], 'a.b.c'],
[
['a', null, 'b'], Error],
[
[null, 'middle', null], 'middle'],
[
[null, 'middle1', null, 'middle2', 'middle3', null], Error],
[
[null, 'middle1', 'middle2', 'middle3', null, 'middle4', 'middle5', null], Error],
[
[null, 'middle1', null, null, null, null, 'middle2', null], Error]
];
function test(fn) {
var length = tests.length,
index,
expected,
args,
actual;
for (index = 0; index < length; index += 1) {
args = tests[index][0];
expected = tests[index][1];
if (typeof expected === 'string') {
try {
actual = fn.apply(null, args);
} catch (e) {
actual = e.message;
}
log('Test ' + index + ': Expected: "' + expected + '" Actual: "' + actual + '"');
} else if (expected === Error) {
expected = 'middle evaluates false';
try {
actual = fn.apply(null, args);
} catch (e) {
actual = e.message;
}
log('Test ' + index + ': Expected: "' + expected + '" Actual: "' + actual + '"');
} else {
log('Test ' + index + ': coder error');
}
}
}
test(getLookupKey);
<script src="https://cdnjs.cloudflare.com/ajax/libs/es6-shim/0.32.2/es6-shim.min.js"></script>
<pre id="out"></pre>
为什么这是downvoted这我不清楚。这个问题没有得到解决,独特和实用,我的答案是有用的,据我可以告诉...有什么我错过了? – Nate
也许你的回答必须包含在你的问题中,以显示你的努力。 –
我不明白为什么。这是一个解决方案,而不是试图找到解决方案。如果这是一个答案,它不应该在答案部分? – Nate