多个嵌套级别数组的下划线

时间:2016-12-09 00:07:58

标签: javascript arrays json object underscore.js

我有一个对象数组,我希望将其转换为键值对的映射,并以id为键。但是,我想在根级别和recipes属性中执行此操作。

数组resp

[
  {
    "id": "1",
    "recipes": [
      {
        "id": 4036
      },
      {
        "id": 4041
      }
    ]
  },
  {
    "id": "2",
    "recipes": [
      {
        "id": 4052
      },
      {
        "id": 4053
      }
    ]
  }
]

期望的结果

{
  "1": {
    "id": "1",
    "recipes": {
      "4036": {
        "id": 4036
      },
      "4041": {
        "id": 4041
      }
    }
  },
  "2": {
    "id": "2",
    "recipes": {
      "4052": {
        "id": 4052
      },
      "4053": {
        "id": 4053
      }
    }
  }
}

我知道如何通过以下函数使用lodash:

使用Underscore.js

function deepKeyBy(arr, key) {
  return _(arr)
    .map(function(o) { // map each object in the array
      return _.mapValues(o, function(v) { // map the properties of the object
        return _.isArray(v) ? deepKeyBy(v, key) : v; // if the property value is an array, run deepKeyBy() on it
      });
    })
    .keyBy(key); // index the object by the key
}

但是,对于这个项目,我正在寻找一个优雅的解决方案,使用下划线来做同样的事情 - 使所有嵌套在数组中的对象都使用id作为关键。有谁知道怎么做?

谢谢!

编辑:添加了所需的输出格式

1 个答案:

答案 0 :(得分:0)

我会在响应上使用Array.reduce,在配方上使用嵌套Array.reduce来产生所需的结果。这是一个es6示例:

resp.reduce((p, c) => {
  p[c.id] = {
    id: c.id,
    recipes: c.recipes.reduce((r, cr) => {
       r[cr.id] = { id: cr.id }
       return r;
    }, {})
  }
  return p;
}, {});

更详细和非es6版本:



var resp = [
  {
    "id": "1",
    "recipes": [
      {
        "id": 4036
      },
      {
        "id": 4041
      }
    ]
  },
  {
    "id": "2",
    "recipes": [
      {
        "id": 4052
      },
      {
        "id": 4053
      }
    ]
  }
]    

var formatted = resp.reduce(function(data, cur) {
  data[cur.id] = {
    id: cur.id,
    recipes: cur.recipes.reduce(function(recips, curRecip) {
       recips[curRecip.id] = { id: curRecip.id }
       return recips;
    }, {})
  }
  return data;
}, {});

console.log(formatted);




如果你必须使用下划线,你可以包裹respc.recipes

_(resp).reduce((p, c) => {
  p[c.id] = {
    id: c.id,
    recipes: _(c.recipes).reduce((r, cr) => {
       r[cr.id] = { id: cr.id }
       return r;
    }, {})
  }
  return p;
}, {});