Есть ли в JavaScript языковая конструкция, похожая на команду php list?

0

У JavaScript есть языковая конструкция или что-то похожее на команду списка php? http://php.net/manual/en/function.list.php

Эта команда присваивает значения массива переменным в одном выражении. Например, учитывая массив:

$info = array('Coffee', 'brown', 'caffeine');

Команда list назначит каждому из значений элемента массива именованные переменные:

list($drink, $color, $power) = $info;

так что:

   echo "$drink is $color and $power makes it special."; // results in:

   Coffee is brown and caffeine makes it special.

Таким образом, это простой способ присвоить значения многим переменным в одном выражении.

Есть ли у JavaScript что-то эквивалентное, где каждая переменная необязательно должна быть назначена отдельно?

Есть ли способ сделать это, используя либо свойства объекта, либо элементы массива? Если нет, может ли быть написана функция, которая бы это сделала? Если единственный способ сделать это - через функцию, то функции потребуется доступ к области, где определены переменные.

Я пробовал решения в этом пятилетнем вопросе: эквивалент Javascript списка PHP(), но они не работают. Изменение прототипа массива не позволяет назначить переменные в моей среде node.js, а назначение массива левой руки является контрольной ошибкой в Chrome. Говорят об экспериментальной новой технике, но говорить уже несколько лет. Я хотел бы знать, есть ли решение для этого лучше, чем те, которые перечислены в связанном вопросе.

  • 0
    Конечно, для этого можно написать функцию, но почему бы не пропустить промежуточные этапы и просто напрямую создать объект с именованными свойствами? Я давно работал с PHP, но я не могу вспомнить, чтобы у меня был сценарий использования для этого сценария.
  • 0
    Хотя это выглядит как дубликат, было бы интересно узнать, есть ли новый ответ на этот вопрос, так как другому вопросу уже более пяти лет. stackoverflow.com/questions/1954426/...
Показать ещё 7 комментариев
Теги:
symbol-table
language-construct

4 ответа

1
Лучший ответ

Я просто написал просто функцию, и она работает. Просто не совсем как список в php. Вот

function list(fn,array){
   if(fn.length && array.length){
       for(var i=0;i<array.length;i++){
            var applyArray = [];
            for(var j=0;j<array[i].length;j++){
                fn[j] = array[i][j];
                applyArray.push(fn[j]);
            }
            fn.apply(this,applyArray);
       }
   }
}

Это ничего захватывающего, но если вы ищете что-то простое и используете для себя, вот оно.

Как это использовать?

//array array mixture for composure
var arrayMixture = [ ["coffee","sugar","milk"], ["tea","sugar","honey"] ];
//call our function
list(function(treat,addin,addin2){
   console.log("I like "+treat+" with " + addin + " and " + addin2);
},arrayMixture);
//output:
//I like coffee with sugar and milk
//I like tea with sugar and honey

Надеюсь, что то, что вы искали

  • 0
    Нет проблем, приятель.
2

Это называется "назначение деструктуризации" в ECMAScript 6. В Mozilla Developer Network есть несколько примеров:

var a, b;
[a, b] = [1, 2]
{a, b} = {a:1, b:2}

В настоящее время он не поддерживается в узле и только в некоторых браузерах, как вы можете видеть в этой таблице совместимости ECMAScript. Вы все равно можете использовать его, если вы переместите свой код в ECMAScript 5 с помощью чего-то вроде Babel.

1

Там экспериментальная функция, написанная php.js, которая пытается адаптировать функцию списка php к js, может быть, вы можете построить на ней следующее:

function list() {
  // http://kevin.vanzonneveld.net
  // +   original by: Brett Zamir (http://brett-zamir.me)
  // %        note 1: Only works in global context and deviates (by necessity) from
  // %        note 1: PHP version by adding the array (which in PHP is an rvalue
  // %        note 1: separate from the list() lvalue) as the last argument
  // *     example 1: var drink, color, power;
  // *     example 1: list('drink', 'color', 'power', ['coffee', 'brown', 'caffeine']);
  // *     example 1: drink +' is '+color+' and '+power+' makes it special.\n';
  // *     returns 1: 'coffee is brown and caffeine makes it special.\n'

  var i = 0, arr = [];

  arr = arguments[arguments.length - 1];

  if (arr && typeof arr === 'object' && arr.change_key_case) { // Duck-type check for our own array()-created PHPJS_Array
    return arr.list.apply(arr, Array.prototype.slice.call(arguments, 0, -1));
  }
  if (arr && typeof arr === 'object' && arr.length && !arr.propertyIsEnumerable('length')) {
    for (i = 0; i < arr.length; i++) {
      this.window[arguments[i]] = arr[i];
    }
  }
  else {
    for (i in arr) {
      if (i.length === parseInt(i).toString().length && parseInt(i) < arguments.length - 1) {
        this.window[arguments[i]] = arr[i];
      }
    }
  }

  return arr;
}
  • 0
    Добро пожаловать и удачи!
0

Я думаю, что принятый ответ EasyBB может быть значительно упрощен для случаев, когда у вас нет вложенных массивов.

var info = [ "Coffee", "brown", "caffeine" ];

(function(drink, color, power) {
    console.log(drink + " is " + color + " and " + power + " makes it special.");
}.apply(this, info));

Теперь вам не нужно определять дополнительную функцию, чтобы выполнить задание. Конечно, при ES6 будет намного лучше, и мы можем использовать деструктурирование массива. Между тем, я бы, вероятно, просто использовал старомодный var drink = info[0], color = info[1], power = info[2]; ; это более читаемо и использует меньше памяти.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню