【问题标题】:Javascript create Object by arrayJavascript通过数组创建对象
【发布时间】:2014-01-26 01:48:18
【问题描述】:

我尝试使用最后一个键的值创建一个对象。我只有一个带有键和值的数组,但不知道如何在不使用 javascript 引用的情况下创建对象。

据我所知,没有办法在 javascript 中创建变量的引用。

这就是我所拥有的:

var value = 'test';
var keys = ['this', 'is', 'a', 'test'];

这就是我想要的:

myObject: {
   this : {
     is: {
       a : {
         test : 'test'
       }
     }
   }
}

知道如何在 JavaScript 中以最好的方式做到这一点吗?

【问题讨论】:

  • JSON?
  • 我不认为 JSON 可以帮助我解决这个问题。我有一个带键的数组。每个键都必须是对象中的一个新对象。最后一个键的值是变量“value”的值。
  • 你确定内部值不是test: 'Test'吗?
  • @Phil 是的——当然。我的错。我将编辑问题。但是感谢您的出色回答(:它仍然可以正常工作。
  • 我编辑了一个salomonic数据,所以以前没有正确的答案是不正确的:)

标签: javascript arrays object recursion


【解决方案1】:

有了这个:

var curObj = myObject = {};
for(var i=0; i<keys.length-1; i++)
   curObj = curObj[keys[i]] = {};    
curObj[value] = keys[i];

输出:

{
   this : {
     is: {
       a : {
         Test : 'test'
       }
     }
   }
}

与其他答案相反,这正是您要求的输出。

干杯

【讨论】:

  • 你是从我的回答中得到的简洁,还是你自己? (无论如何都可以)
  • 我每分钟都在重构(你可以看到版本),甚至没有意识到你回答了。不过,我的给出了不同的结果
  • 是的,你的给出了 OP 要求的答案(我怀疑这是错误的 :)
  • 无论如何,请注意循环后i 的值将是keys.length-1 的值,因此如果您愿意,可以使用它来使最后一行更清晰。
  • 现在不看,但 OP 更新了他们的问题 ;)。我仍然对解决更困难的原始查询的努力表示赞成
【解决方案2】:

这个怎么样...

const value = 'test'
const keys = ['this', 'is', 'a', 'test']

const myObject = keys.reduceRight((p, c) => ({ [c]: p }), value)

console.info(myObject)

或者,如果您不喜欢对象字面量快捷键和箭头功能...

keys.reduceRight(function(p, c) {
  var o = {};
  o[c] = p;
  return o;
}, value);

如果您需要 IE Array.prototype.reduceRight() - Polyfill。

【讨论】:

  • 最终节点有错误,但这段代码太漂亮了,我不能投票
  • 它最终创建了test: "Test" 而不是Test : "test"。但无论如何,虽然它不正确,但它有我的投票,不错的代码
  • @EdgarVillegasAlvarado 啊。 OP 的描述听起来像是 value 应该是最里面的值,而不是键。我已经要求澄清
  • 哇。惊人的。以前从未在 javascript 中听说过这种方法。感谢这个干净的代码。我会尝试它并会使用它。编辑:我试过了,这对我的问题很好!非常感谢老兄:)
【解决方案3】:
var o={}, c=o;
var value = 'Test';
var keys = 'this is a test'.split(' ');

for (var i=0; i<keys.length-1; ++i) c = c[keys[i]] = {};
c[keys[i]] = value;

console.log(JSON.stringify(o));
// {"this":{"is":{"a":{"test":"Test"}}}}

【讨论】:

  • keys 已经是一个数组了?为什么要把它变成一个字符串然后再变成一个数组?
  • @Phil BC 我懒得用鼠标来复制/粘贴,我想向 OP 展示另一种懒惰的程序员方法来创建字符串数组,减少输入。
【解决方案4】:

如果你想要这样的输出

{
   this : {
     is: {
       a : 'test'
     }
   }
}

执行以下操作

var keys = ['this', 'is', 'a', 'test'];
var output = keys.reduceRight((p,c)=>({[c]:p}))
console.log(output)

输出会是这样的

{ this: { is: { a: 'test' } } }

【讨论】:

    猜你喜欢
    • 2021-09-24
    • 1970-01-01
    • 2012-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-05
    • 1970-01-01
    相关资源
    最近更新 更多