简体   繁体   English

Javascript for 循环填充对象

[英]Javascript for loop to fill in object

I have an array of domains: var domains = ["domain1", "domain2", "domain3"];我有一个域数组: var domains = ["domain1", "domain2", "domain3"];

Expected result should be:预期结果应该是:

var domainData = {
  type: 'combo',
  name: 'domain',
  width: 200,
  offsetLeft: 30,
  label: 'Test label',
  required: true,
  options: [
    {text: 'domain1', value: 'domain1'},
    {text: 'domain2', value: 'domain2'},
    {text: 'domain3', value: 'domain3'},
  ]
};

This is what I was trying to do, but it doesn't work:这是我试图做的,但它不起作用:

for(var i = 0; i < domains.length; i++) {
  console.log(domains[i]);
  var domainData = {
    type: 'combo',
    name: 'domain',
    width: 200,
    offsetLeft: 30,
    label: 'Test label',
    required: true,
    options: [{
      text: domains[i],
      value: domains[i],
    }]
  };
}

You can play with code here: https://jsbin.com/vadered/edit?js,console你可以在这里玩代码: https : //jsbin.com/vadered/edit?js,console

The issue is that you're creating every time a new domainData object using the for loop .问题是您每次都使用for循环创建新的domainData对象。

You can use map method by passing a callback provided function which is applied for every item from your given array.您可以通过传递回调提供的函数来使用map方法,该函数应用于给定数组中的每个项目。

 var domains = ["domain1", "domain2", "domain3"]; var domainData = { type: 'combo', name: 'domain', width: 200, offsetLeft: 30, label: 'Test label', required: true, options: domains.map(elem=> ({text:elem, value:elem})) }; console.log(domainData);

Move the domainData object outside your function loop, then add the values for options :domainData对象domainData函数循环之外,然后添加options的值:

var domainData = {
    type: 'combo',
    name: 'domain',
    width: 200,
    offsetLeft: 30,
    label: 'Test label',
    required: true,
    options: []
};

for(var i = 0; i < domains.length; i++) {
    domainData.options.push({ 'text':domains[i], 'value': domains[i] });
}

You do not need a loop for that, since you actually have only 1 object.您不需要循环,因为您实际上只有 1 个对象。

What you need is to transform your domain array to options inside your other object.您需要的是将域数组转换为其他对象内的选项。 Try this:尝试这个:

var domainData = {
    type: 'combo',
    name: 'domain',
    width: 200,
    offsetLeft: 30,
    label: 'Test label',
    required: true,
    options: domains.map(function(d){ return {text: d, value: d}})
  };

Issue you have is you are recreating the parent object on each iteration and not appending to the child array您遇到的问题是您在每次迭代时都重新创建父对象,而不是附加到子数组

So create the child array and use that when you create the object.因此,创建子数组并在创建对象时使用它。

 var domains = ["domain1", "domain2", "domain3"]; var options = domains.map(function(domain) { return { text: domain, value: domain } }) // without map // var options = []; // for (var i=0; i<domains.length; i++) { // options.push({text: domains[i], value: domains[i]} // } var domainData = { type: 'combo', name: 'domain', width: 200, offsetLeft: 30, label: 'Test label', required: true, options: options }; console.log(domainData)

i played a little bit with your code and ended up with this:我玩了一点你的代码,最后得到了这个:

 var domains = ["domain1", "domain2", "domain3"]; var optionsBis = []; for(var i = 0; i < domains.length; i++) { optionsBis.push({ text: domains[i], value: domains[i] }) } var domainData = { type: 'combo', name: 'domain', width: 200, offsetLeft: 30, label: 'Test label', required: true, options:optionsBis }; console.log(domainData)

Hope it helps希望能帮助到你

 var domains = ["domain1", "domain2", "domain3"]; var domainData = { type: 'combo', name: 'domain', width: 200, offsetLeft: 30, label: 'Test label', required: true, options: [] }; domains.forEach(domain => { domainData.options.push({ text: domain, value: domain }) }); console.log(domainData);

You need to remove the main content of domainData out of iterator, and push domains to options, like this:您需要从迭代器中删除 domainData 的主要内容,并将域推送到选项,如下所示:

var domainData = {
  type: 'combo',
  name: 'domain',
  width: 200,
  offsetLeft: 30,
  label: 'Test label',
  required: true,
  options: []
 };

domains.forEach(domain => {
  domainData.options.push({
    text: domain,
    value: domain
  })
});

It's better to create a new copy of object domainData, because of possible nested values.由于可能存在嵌套值,最好创建对象 domainData 的新副本。

var domains = ["domain1", "domain2", "domain3"];
var domainData = {
    type: 'combo',
    name: 'domain',
    width: 200,
    offsetLeft: 30,
    label: 'Test label',
    required: true,
  };
var newObjectData  = Object.assign( {}, domainData, {options: domains.map((val) => ({text: val, value: val}))} );

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM