JavaScript: функциональное отображение?

Есть ли более лаконичный способ написать это?

var me = {};

for (var i in you) {
 me[i] = you[i];
}

(где you - произвольно растянутый массив JavaScript)

Другими словами, учитывая ввод:

var you = [
 "what",
 "r",
 "u"
];

Вывод me становится:

me = {
 0: "what",
 1: "r",
 2: "u"
};

Например, однострочник, который использует какой-то функциональный метод?

4 голоса | спросил AgileMeansDoAsLittleAsPossible 1 FebruaryEurope/MoscowbTue, 01 Feb 2011 07:33:34 +0300000000amTue, 01 Feb 2011 07:33:34 +030011 2011, 07:33:34

5 ответов


0

Почему ты хочешь это сделать? Массивы в JavaScript являются объектами, за исключением некоторых дополнительных свойств, таких как slice, splice, push и length

Внутренне, массивы и объекты хранятся точно так же, например: array[0] - это то же самое , что и array["0"] или object["0"] (в отличие от других языков, где индексы смежных массивов фактически находятся в смежной памяти - «индексы» массивов просто преобразуется в строки в JavaScript).

Итак, если вы просто хотите скопировать данные, этого будет достаточно:

me = you.slice(); // me is a copy of you, but is still an array

Или, если вам действительно нужны какие-то функции сопоставления, то underscore.js предоставляет целый коллекция инструментов функционального программирования для вашего прочтения.

ответил David Tang 1 FebruaryEurope/MoscowbTue, 01 Feb 2011 07:43:10 +0300000000amTue, 01 Feb 2011 07:43:10 +030011 2011, 07:43:10
0

Нет встроенной функции, которая выполняет то, что вы просите, однако некоторые широко используемые библиотеки javascript, такие как jQuery, предоставляют такую ​​функцию. В случае jQuery: jQuery.extend()

Использование:

var me = {};
jQuery.extend(me,someObject);

//or, equivalently -
var me2 = jQuery.extend({},someObject);
ответил tobyodavies 1 FebruaryEurope/MoscowbTue, 01 Feb 2011 07:39:36 +0300000000amTue, 01 Feb 2011 07:39:36 +030011 2011, 07:39:36
0

jQuery имеет функцию extend() ( документация здесь ). Ваш код будет выглядеть так:

var me = {};
var you = ["what", "r", "u"];
$.extend(me, you);

Это позволит вам делать такие вещи, как:

alert("Second element: " + me[1]);

Это немного странно, но я думаю, это то, что вы ищете.

ответил RustyTheBoyRobot 1 FebruaryEurope/MoscowbTue, 01 Feb 2011 07:55:20 +0300000000amTue, 01 Feb 2011 07:55:20 +030011 2011, 07:55:20
0

Я видел, чего вы пытались достичь с помощью вашего средства форматирования строк. Вместо того, чтобы отвечать на ваш первоначальный вопрос о разработке краткой реализации одной его части, я предложу краткую (и более гибкую) реализацию для всего этого:

String.prototype.format = function () {
    var args = arguments;

    return this.replace(/\{(?:(\d+)|(\w+))\}/g, function (s, idx, prop) {
        return prop && args[0]
            ? args[0][prop]
            : args[idx];
    });
};

Если внутри токена есть число n "{n}", для замены используется n-й аргумент. В противном случае для нечисловых ключей выбирается соответствующее свойство первого аргумента.

Например:

"I have {1} {name}s in my basket.".replace({ type: "fruit", name: "eggplant" }, 4);

Возврат:

"I have 4 eggplants in my basket."
ответил Ates Goral 1 FebruaryEurope/MoscowbTue, 01 Feb 2011 08:29:00 +0300000000amTue, 01 Feb 2011 08:29:00 +030011 2011, 08:29:00
0

Библиотека underscore.js также имеет базовую функцию расширения.

var me = _({}).extend(you)

или

var me = {}
_(me).extend(you)

или

var me = {}
_.extend(me, you)
ответил futuremint 1 FebruaryEurope/MoscowbTue, 01 Feb 2011 08:29:06 +0300000000amTue, 01 Feb 2011 08:29:06 +030011 2011, 08:29:06

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132