将对象结构减少为仅包含特定属性的值

时间:2017-05-03 08:57:16

标签: javascript lodash

假设给出以下对象:

const foo = {
  id: 'foo',
  name: '...',
  test: () => 'fn',
  nestedObject: {
    id: 'nested',
    name: '...',
    nestedObjects: [{
      id: 'bar',
      name: '...',
      anotherNested: {
        id: 'n1',
        name: '...',
        oneMoreNestedObjects: [{
          id: 'n11',
          name: '...',
        }, {
          id: 'n12',
          name: '...',
        }]
      }
    }, {
      id: 'bar2',
      name: '...',
    }]
  }
};

我想通过仅选择名为id的属性或者它是具有id属性的(Array of)对象来将其转换为对象。所以在我的例子中它将是:

const result = {
  id: 'foo',
  nestedObject: {
    id: 'nested',
    nestedObjects: [{
      id: 'bar',
      anotherNested: {
        id: 'n1',
        oneMoreNestedObjects: [{
          id: 'n11',
        }, {
          id: 'n12',
        }]
      }
    }, {
      id: 'bar2',
    }]
  }
};
顺便说一句:我使用lodash很好。

2 个答案:

答案 0 :(得分:1)

您可以对嵌套数组和对象使用迭代递归方法。

function filter(object) {
    return Object.keys(object).reduce(function (r, k) {
        if (k === 'id') {
            r[k] = object[k];
        } else if (object[k] && typeof object[k] === 'object') {
            r[k] = filter(object[k]);
        }
        return r;
    }, Array.isArray(object) ? [] : {});
}

var foo = { id: 'foo', name: '...', test: () => 'fn', nestedObject: { id: 'nested', name: '...', nestedObjects: [{ id: 'bar', name: '...', anotherNested: { id: 'n1', name: '...', oneMoreNestedObjects: [{ id: 'n11', name: '...', }, { id: 'n12', name: '...', }] } }, { id: 'bar2', name: '...', }] } },
    result = filter(foo);

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 1 :(得分:0)

您是否考虑过使用递归?注意深层对象,这可能超过最大调用堆栈。

  function getIdsFromObjects(nObj) {
    return Object.keys(nObj).reduce(function (curr, next) {
      if (next === 'id') {
        curr[next] = nObj[next]
      }
      if (Array.isArray(nObj[next])) {
        curr[next] = nObj[next].map(function(mapObj) {
          return getIdsFromObjects(mapObj)
        })
      }
      if (typeof obj[next] === 'object' && !Array.isArray(nObj[next])) {
         curr[next] = getIdsFromObjects(nObj[next])
      }
      return curr;
    },{})
  }

console.log(JSON.stringify(getIdsFromObjects(foo), null, 4))