JavaScript: функциональное отображение? - PullRequest
4 голосов
/ 01 февраля 2011

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

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"
};

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

Ответы [ 5 ]

3 голосов
/ 01 февраля 2011

Почему вы хотите это сделать? Массивы в 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 предоставляет полный набор инструментов функционального программирования для вашего прочтения.

1 голос
/ 01 февраля 2011

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

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

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

//or, equivalently -
var me2 = jQuery.extend({},someObject);
0 голосов
/ 01 февраля 2011

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

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

или

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

или

var me = {}
_.extend(me, you)
0 голосов
/ 01 февраля 2011

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

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."
0 голосов
/ 01 февраля 2011

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...