#javascript
#javascript
Вопрос:
Посмотрите на 3 строки кода в этой функции Javascript. Предположим, что y
это всегда будет строка:
function example(x, y) {
var s = {};
s[y] = x;
return s;
}
Принимая во внимание следующее:
- Без дальнейшего переноса его в функцию
- Без использования
;
Возможно ли объединить 3 строки кода в одну?
Комментарии:
1. Изучение подобных «кодовых приемов» — пустая трата времени. Если это вопрос для интервью, то от стыда.
2. Нет, если будет найден хороший ответ, он действительно будет использован в проекте.
Ответ №1:
Да, с небольшим количеством уродливого кода:
function example(x, y, s) {
return (s = {})[y] = x, s;
}
Дополнительный параметр s
не передается в функцию, он только там должен быть объявлен как переменная, поэтому вам не нужна дополнительная строка var s;
. (Если вы не объявляете его локально, оно становится глобальной переменной, что является плохой практикой.)
Значение присваивания s = {}
— это то, что присвоено, поэтому вы можете выполнить присвоение, а затем продолжить использовать значение в выражении.
Оператор запятой возвращает последнее значение, например, (1,2)
возвращает значение 2
. Таким образом, вы можете добавить , s
к выражению, чтобы оно возвращало s
.
Редактировать:
Другой вариант заключается в использовании s
в качестве переменной в for
цикле и выходе из цикла:
function example(x, y) {
for(var s = {}; s[y] = x, true;) return s;
}
Комментарии:
1. Почти то, что мне нужно. Очень мило! К сожалению, можно редактировать только эти 3 строки внутри функции, передача ‘s’ в качестве дополнительного параметра невозможна. неважно — ваша вторая правка покрывает это.
2. @michael: Кстати, я только что добавил вариант, который использует
for
для удаления переменной вместо того, чтобы использовать ее в качестве параметра. Тем не менее, это все еще довольно уродливый код.3. Хотя я согласен, что
for
оператор соответствует определению отдельного оператора для целей code-golf, конечно,for
оператор, который сам по себе включает все три оператора из исходного вопроса плюс дополнительное ‘true’, все еще не является улучшением.4. Guffa — вопрос, пункт 2: Без использования
;
5. @nnnnnn: Конечно, это не улучшение, исходный код настолько хорош, насколько это возможно, он просто отличается.
Ответ №2:
Является ли использование function
обманом? 🙂
function example(x, y) {
return new function () { this[y] = x; };
}
Ответ №3:
Всегда есть злой eval:
function example(x, y) {
return eval('({' y ':"' x '"})');
}
Но я все еще не вижу в этом смысла.
Комментарии:
1. Я как раз собирался сделать это сам. Глупый вопрос требует глупого ответа.