Вопрос

На других языках, таких как Python 2 и Python 3, вы можете определить и назначать значения переменной кортежа и получить их значения, как это:

tuple = ("Bob", 24)
name, age = tuple
print(name)           #name evaluates to Bob
print(age)            #age evaluates to 24

Есть ли что -то подобное в JavaScript? Или мне просто нужно сделать это уродливым способом с массивом:

tuple = ["Bob", 24]
name = tuple[0]       //name Evaluates to Bob
age = tuple[1]        //age Evaluates to 24

Есть ли лучший способ имитировать кортежи Python в JavaScript 5?

Это было полезно?

Решение

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

Другие советы

JavaScript 1.7 добавлен разрушенное задание что позволяет вам делать по существу то, что вы хотите.

function getTuple(){
   return ["Bob", 24];
}
var [a, b] = getTuple();
// a === "bob" , b === 24 are both true

Вы можете сделать что -то подобное:

var tuple = Object.freeze({ name:'Bob', age:14 })

а затем обратитесь к имени и возрасту как атрибуты

tuple.name 
tuple.age 

Эта функция «кортеж» она называется деструктуризацией в Ecmascript2015 и вскоре поддерживается современными браузерами. На данный момент, Только Firefox и Chrome поддерживают это.

Но эй, ты можешь использовать транспорист.

Код будет выглядеть так же хорошо, как Python:

let tuple = ["Bob", 24]
let [name, age] = tuple

console.log(name)
console.log(age)

Замороженный массив ведет себя одинаково с корпусом из питона:

const tuple = Object.freeze(["Bob", 24]);
let [name, age]; = tuple
console.debug(name); // "Bob"
console.debug(age); // 24

Быть причудливым и определить класс

class Tuple extends Array { 
  constructor(...items) { 
    super(...items); 
    Object.freeze(this);
  } 
}

let tuple = new Tuple("Jim", 35);
let [name, age] = tuple;
console.debug(name); // Jim
console.debug(age); // 35
tuple = ["Bob", 24]; // no effect 
console.debug(name); // Jim
console.debug(age); // 25

Работает сегодня во всех последних браузерах.

К сожалению, вы не можете использовать этот синтаксис назначения кортежей в сценарии (ECMA | java).

РЕДАКТИРОВАТЬ: Кто -то связан с Mozilla/JS 1.7 - это не сработает кросс -браузер, но если это не требуется, то есть ваш ответ.

КУТУ не поддерживаются в JavaScript

Если вы ищете неизменный список, Object.Freeze () может использоваться, чтобы сделать массив неизбежным.

Метод Object.Freeze () замораживает объект: то есть предотвращает добавление новых свойств; предотвращает удаление существующих свойств; и предотвращает изменение существующих свойств, или их перечисление, конфигурируемость или записи. По сути, объект делает эффективно неизменным. Метод возвращает замороженный объект.

Источник: Mozilla Developer Network - Object.Freeze ()

Назначьте массив как обычно, но заблокируйте его, используя 'object.freeze ()

> tuple = Object.freeze(['Bob', 24]);
[ 'Bob', 24 ]

Используйте значения, как вы будете регулярно массив (Python Multi-Assignment не поддерживается)

> name = tuple[0]
'Bob'
> age = tuple[1]
24

Попытка назначить новое значение

> tuple[0] = 'Steve'
'Steve'

Но значение не изменено

> console.log(tuple)
[ 'Bob', 24 ]

Это не предназначено для того, чтобы на самом деле использоваться в реальной жизни, просто интересное упражнение. Видеть Почему использование функции eval JavaScript - плохая идея? Для деталей.

Это самое близкое, что вы можете получить, не прибегая к расширениям, специфичным для поставщика:

myArray = [1,2,3];
eval(set('a,b,c = myArray'));

Вспомогательная функция:

function set(code) {
    var vars=code.split('=')[0].trim().split(',');
    var array=code.split('=')[1].trim();
    return 'var '+vars.map(function(x,i){return x+'='+array+'['+i+']'}).join(',');
}

Доказательство того, что он работает в произвольной области:

(function(){
    myArray = [4,5,6];
    eval(set('x,y,z = myArray'));
    console.log(y);  // prints 5
})()

eval не поддерживается в сафари.

В качестве обновления ответа министра вы можете сделать это с ES2015:

function Tuple(...args) {
  args.forEach((val, idx) => 
    Object.defineProperty(this, "item"+idx, { get: () => val })
  )
}


var t = new Tuple("a", 123)
console.log(t.item0) // "a"
t.item0 = "b"
console.log(t.item0) // "a"

https://jsbin.com/fubaluwimo/edit?js, console

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

const Tuple = (...args) => {
  const Tuple = f => f(...args);
  return Object.freeze(Object.assign(Tuple, args));
};

const get1 = tx => tx((x, y) => x);

const get2 = tx => tx((x, y) => y);

const bimap = f => g => tx => tx((x, y) => Tuple(f(x), g(y)));

const toArray = tx => tx((...args) => args);

// aux functions

const inc = x => x + 1;
const toUpperCase = x => x.toUpperCase();

// mock data

const pair = Tuple(1, "a");

// application

console.assert(get1(pair) === 1);
console.assert(get2(pair) === "a");

const {0:x, 1:y} = pair;
console.log(x, y); // 1 a

console.log(toArray(bimap(inc) (toUpperCase) (pair))); // [2, "A"]

const map = new Map([Tuple(1, "a"), Tuple(2, "b")]);
console.log(map.get(1), map.get(2)); // a b

Обратите внимание Tuple не используется в качестве нормального конструктора. Решение вообще не полагается на систему прототипов, а исключительно на функции более высокого порядка.

Каковы преимущества кортежей ArrayS используется как кортежи? Церковные кодируемые кортежи являются неизменными по дизайну и, таким образом, предотвращают побочные эффекты, вызванные мутациями. Это помогает создать более надежные приложения. Кроме того, легче рассуждать о коде, который различает ArrayS как тип коллекции (например, [a]) и кортежи как связанные данные различных типов (например, (a, b)).

Вот простая реализация JavaScript Tuple:

var Tuple = (function () {
   function Tuple(Item1, Item2) {
      var item1 = Item1;
      var item2 = Item2;
      Object.defineProperty(this, "Item1", {
          get: function() { return item1  }
      });
      Object.defineProperty(this, "Item2", {
          get: function() { return item2  }
      });
   }
   return Tuple;
})();

var tuple = new Tuple("Bob", 25); // Instantiation of a new Tuple
var name = tuple.Item1; // Assignment. name will be "Bob"
tuple.Item1 = "Kirk"; // Will not set it. It's immutable.

Это 2-й тупин, однако, вы можете изменить мой пример, чтобы поддержать 3,4,5,6 и т. Д. Стужки.

[a, b, c] = [2, 'momo', 7]  // b === 'momo', c ===7 ...
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top