Создание имени объекта и свойства по переменным - PullRequest
0 голосов
/ 05 июля 2018

У меня есть функция с объектом внутри, как это:

$scope.createAuction = function () {
    var auction = { auction: { langData: {} } };

    if($scope.selected.tab === $scope.infoTabs[0]) {
        auction.auction = {
            type: 'car',
            layout: $scope.selected.description
        };
        if(auction.auction.layout === 1) {
            for(var i = 0, l = $scope.langInput.values.length; i < l; i++) {
                /*
                auction.auction.langData.push({
                    $scope.langInput.values.selected: {
                        name: $scope.inputs.auction_name_account[i + 1]
                    }
                });
                */
                console.log($scope.inputs.auction_name_account[i + 1]);
                console.log($scope.langInput.values[i].selected);
            }
        }
    }
    console.log(JSON.stringify(auction));
}

$scope.langInput.values[i].selected - это pl и eng, но пользователь может изменить его и добавить новый или удалить один. $scope.inputs.auction_name_account[i + 1] - это описание на вышеуказанных языках, предоставленное пользователем. Также, если пользователь меняет вышеуказанные языки, он должен предоставить описание на языках, которые он выбрал.

Консольные данные хороши, но я не знаю, как построить этот объект, поэтому после завершения работы функции это будет выглядеть так:

{  
   "auction":{  
      "type":"account",
      "layout":1
      "langData":{
          "pl":{
              "name":"description in polish provided by user"
          } 
          "eng":{
              "name":"description in english provided by user"
          }
      }
   }
}

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


хорошо, я знаю, что этот JSON ниже отличается от объекта выше, но на самом деле не имеет значения, что позже я буду использовать JSON.stringify (). У меня проблема только с привязкой объектов к объекту langData.


Редактировать

Как подсказывает @Patrick Evans, я изменил свой код, поэтому я больше не перезаписываю его в коде:

$scope.createAuction = function () {
    var auction = { auction: { langData: {} } };

    if($scope.selected.tab === $scope.infoTabs[0]) {
        Object.assign(auction.auction, {
          type: 'account',
          layout: $scope.selected.description
        });
        if(auction.auction.layout === 1) {
            //alert($scope.langInput.values.length);
            for(var i = 0, l = $scope.langInput.values.length; i < l; i++) {
                auction.auction.langData.push({
                    $scope.langInput.values.selected: {
                        name: $scope.inputs.auction_name_account[i + 1]
                    }
                });
                console.log($scope.inputs.auction_name_account[i + 1]);
                console.log($scope.langInput.values[i].selected);
            }
        }
    }
    if($scope.selected.tab === $scope.infoTabs[1]) {}
    if($scope.selected.tab === $scope.infoTabs[2]) {}
    console.log(JSON.stringify(auction));
}

Я все еще получаю синтаксическую ошибку:

Uncaught SyntaxError: Неожиданный токен.

из этой строки

$scope.langInput.values.selected: { также моя IDE выделяет его и говорит

: ожидается вместо этого. учитывая

1 Ответ

0 голосов
/ 05 июля 2018

Вы инициализировали auction примерно так:

var auction = { auction: { langData: {} } };

Но затем вы перезаписываете свойство auction, выполняя

auction.auction = {
  type: 'car',
  layout: $scope.selected.description
};

Это означает, что в auction.auction больше нет свойства langData. Вы можете воссоздать это свойство или расширить свойство auction, сохранив все предыдущие свойства, которые уже существовали.

//recreate the property
auction.auction = {
  type: 'car',
  layout: $scope.selected.description,
  langData:{}
};
//or extend the property
Object.assign(auction.auction,{
  type:'car',
  layout:$scope.selected.description,
});
//or extend by explicitly setting each property
auction.auction.type = 'car';
auction.auction.layout = $scope.selected.description,

Для фактического помещения данных в langData, это зависит от того, что вы имели в виду.

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

//if you actually meant to use $scope.langInput.values.selected
auction.auction.langData[$scope.langInput.values[i].selected] = {
  name: $scope.inputs.auction_name_account[i + 1]
};
//or if values is an array
let propName = $scope.langInput.values[i];
auction.auction.langData[propName] = {
  name: $scope.inputs.auction_name_account[i + 1]
};

В противном случае, если он должен быть массивом, вам нужно изменить его на массив, а затем вы можете создать свой объект, используя имена вычисляемых свойств

auction.auction = {
  type: 'car',
  layout: $scope.selected.description,
  langData:[] //<-- array instead of object
};

/*...*/
auction.auction.langData.push({
  [$scope.langInput.values[i].selected]:{ //<--computed name syntax
    name:$scope.inputs.auction_name_account[i + 1]
  }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...