2015-01-24 3 views
0

Мне тяжело описать мой случай, так что простите меня, если это разрешено раньше.Javascript: установка ключа на объекте путем объединения ранее определенных ключей

Я хочу, чтобы определить объект следующим образом:

var foo = [ 
    { 
     firstName : 'John', 
     lastName : 'Doe', 
     fullName : this.firstName + this.lastName 
    }, 
    // OR 
    { 
     firstName : 'Jane', 
     lastName : 'Doe', 
     herID : Do-something with the first and last name that were just defined, such as computeCombination(firstName, lastName) 
    } 
] 

Является ли это своего рода декларация возможного?

Мне нужно закончить объявление foo сразу и здесь, я не могу вносить изменения в объект позже. Более того, я не хочу вмешиваться в индексы здесь, например, используя foo [0] .firstName и т. Д.

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

Спасибо

+0

Нет, это невозможно. –

+0

Что бы вы посоветовали для достижения подобной декларации? – batilc

+0

Зависит, имеет ли каждый объект другой набор свойств? –

ответ

0

Вы не можете делать то, что вы просите с «статическим» декларации, как вы показываете, потому что this не установлен на объекте в статическом объявлении, так что вы не можете обратиться к другие свойства объекта с помощью this, но если вы хотите ту же логику для принятия fullName собственности, вы можете сделать это с помощью динамической декларации с помощью конструктора, как это:

function Person(firstName, lastName) { 
    this.firstName = firstName; 
    this.lastName = lastName; 
    this.fullName = firstName + " " + this.lastName; 
} 

var people = [new Person("John", "Doe"), new Person("Jane", "Doe")]; 

Если вы хотите другая логика для каждой записи, то вы можете передать функцию обратного вызова в Person() конструктор, который определяет логику использования, как это:

function Person(firstName, lastName, fn) { 
    this.firstName = firstName; 
    this.lastName = lastName; 
    this.fullName = fn(firstName, lastName); 
} 

function combine(f, l) { return f + " " + l;} 
function makeID(f, l) {return f.slice(0, 1) + l;} 

var people = [new Person("John", "Doe", combine), new Person("Jane", "Doe", makeID)]; 

Или, если вы действительно хотите разные вещи для других свойств, то может быть все, что в массив не является одним и тем же типом объекта, поэтому вы можете использовать разные конструкторы, когда вам нужно что-то другое. Вы на самом деле не объяснили, какова ваша цель, поэтому мы не можем дать рекомендации по деталям. Но дело в том, что у вас есть много разных вариантов для вычисления других свойств на основе оригинальных двух имен. Вот пример с различными конструкторами:

function PersonName(firstName, lastName) { 
    this.firstName = firstName; 
    this.lastName = lastName; 
    this.fullName = firstName + " " + lastName; 
} 

function PersonID(firstName, lastName) { 
    this.firstName = firstName; 
    this.lastName = lastName; 
    this.herID = firstName.slice(0, 1) + lastName; 
} 

var people = [new PersonName("John", "Doe"), new PersonID("Jane", "Doe")]; 

Множество вариантов.

+0

Имейте в виду, что эти решения не будут обновляться после изменения свойства, например: http://jsfiddle.net/suyd54z8/ – pawel

+0

Основная проблема заключается в том, что я не могу сделать динамическое объявление. Это должно быть статическим:/ – batilc

+0

@batilc - тогда, как говорит начало моего ответа, вы не можете вычислять значения ранее объявленных свойств в статическом объявлении. Это ограничение статической декларации. Почему он должен быть статичным? Это Javascript. Динамический код, как я показал, разрешен. Конечный результат тот же, массив объектов со свойствами. Не важно, как создавались объекты. – jfriend00

3

Это возможно с помощью getters.

var foo = [ 
    { 
     firstName : 'John', 
     lastName : 'Doe', 
     get fullName(){ return this.firstName +' '+ this.lastName; } 
    }] 


console.log(foo[0].fullName); //John Doe 

http://jsfiddle.net/6jq8ky0k/1/

+0

Почему это лучше, чем использование конструктора? Этот код не может использоваться повторно как конструктор. – jfriend00

+0

Из вопроса: «* Кроме того, каждый объект в массиве может иметь другую комбинационную логику для последнего ключа. *« Поэтому повторное использование может не быть главной проблемой здесь. – pawel

Смежные вопросы