从对象数组中的属性创建对象

时间:2017-02-06 10:38:44

标签: javascript

我有一个像这样的对象数组:

[
{id: 'id1', random: 'labels.prop1'},
{id: 'id2', random: 'labels.prop2'},
{id: 'id3', random: 'texts.anotherprop'}
]

是否有一种简短的方法可以从该数组生成基于属性random的对象?我需要这个:

{
  texts: { 
       anotherprop: ''
  },
  labels: { 
       prop1: '', 
       prop2: '' 
  }
}

3 个答案:

答案 0 :(得分:1)

您可以迭代数组并根据random的部分构建对象。

function setValue(object, path, value) {
    var fullPath = path.split('.'),
        way = fullPath.slice(),
        last = way.pop();

    way.reduce(function (r, a) {
        return r[a] = r[a] || {};
    }, object)[last] = value;
}

var data = [{ id: 'id1', random: 'labels.prop1' }, { id: 'id2', random: 'labels.prop2' }, { id: 'id3', random: 'texts.anotherprop' }],
    result = {};

data.forEach(function (o) {
    setValue(result, o.random, '');
});

console.log(result);

答案 1 :(得分:1)

您可以使用reduce()两次来构建此嵌套对象。

var data = [
{id: 'id1', random: 'labels.prop1'},
{id: 'id2', random: 'labels.prop2'},
{id: 'id3', random: 'texts.anotherprop'}
]

var result = data.reduce(function(r, o) {
  var arr = o.random.split('.')
  arr.reduce(function(a, b, i) {
    return (i != arr.length - 1) ? a[b] || (a[b] = {}) : a[b] = ''
  }, r)
  return r;
}, {})

console.log(result)

答案 2 :(得分:0)



var arr = [
  {id: 'id1', random: 'labels.prop1'},
  {id: 'id2', random: 'labels.prop2'},
  {id: 'id3', random: 'texts.anotherprop'}
];

var result = {};
arr.forEach(function(o) {
  var parts = o.random.split('.');
  var r = result;
  var i = 0;
  for( ; i < parts.length - 1; i++) {
    r[parts[i]] = r[parts[i]] || {};
    r = r[parts[i]];
  }
  r[parts[i]] = '';
});

console.log(result);
&#13;
&#13;
&#13;