Оптимизировать свойство пользовательского объекта в массиве с помощью Javascript

#javascript

#javascript

Вопрос:

Посмотрите на 3 строки кода в этой функции Javascript. Предположим, что y это всегда будет строка:

 function example(x, y) {
    var s = {};
    s[y]  = x;
    return s;
}
  

Принимая во внимание следующее:

  1. Без дальнейшего переноса его в функцию
  2. Без использования ;

Возможно ли объединить 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. Я как раз собирался сделать это сам. Глупый вопрос требует глупого ответа.