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

4
我有一个类似于这样的对象数组:

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

有没有一种简便的方法,可以根据属性 random 从该数组生成一个对象?我需要这样做:

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

为什么需要空值? - ibrahim mahrir
@ibrahimmahrir,我只是为了清楚起见加上了那个词,以表明那些是对象属性。 - neptune
3个回答

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
你可以使用两个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)


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);


@ibrahimmahrir 我给你点赞是因为它有效。 - neptune

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接