【问题标题】:Spread operator with reduce function in jsjs中带有reduce函数的扩展运算符
【发布时间】:2021-12-07 10:21:07
【问题描述】:

我试图生成给定 json 对象的所有可能路径。我如何生成路径,但我希望我的最终数组以扁平方式(最终数组内没有嵌套数组)。 我尝试扩展数组,但最终数组包含一些嵌套数组。我想以更扁平的方式拥有所有元素。

当前操作:

[
  "obj",
  "level1.level2.level3.key",
  [
    "arrayObj.one[0].name",
    "arrayObj.one[0].point"
  ]
]

预期:

[
  "obj",
  "level1.level2.level3.key",
  "arrayObj.one[0].name",
  "arrayObj.one[0].point"
]

下面我附上了我试过的sn-p。

const allPaths = (obj, path = "") =>
  Object.keys(obj).reduce((res, el) => {
    if (Array.isArray(obj[el]) && obj[el].length) {
      return [...res, ...obj[el].map((item, index) => {
        return [...res, ...allPaths(item, `${path}${el}[${index}].`)];
      })];
    } else if (typeof obj[el] === "object" && obj[el] !== null) {
      return [...res, ...allPaths(obj[el], `${path}${el}.`)];
    }
    return [...res, path + el];
  }, []);

const obj = {
  obj: 'sample',
  level1: {
    level2: {
      level3: {
        key: 'value'
      }
    }
  },
  arrayObj: {
    one: [{
        name: 'name',
        point: 'point'
      },
      {
        name: 'name2',
        point: 'point2'
      },
      {
        name: 'name2',
        point: 'point2'
      }
    ]
  }
}

console.log(allPaths(obj));

【问题讨论】:

标签: javascript json spread


【解决方案1】:

更新:我之前没有正确理解这个问题。现在我愿意。所以是的,下面的代码将为您解决问题。

你希望你的对象被点压扁

如果是这样的话,下面应该可以工作

const obj = {
  obj: 'sample',
  level1: {
    level2: {
      level3: {
        key: 'value'
      }
    }
  },
  arrayObj: {
    one: [{
        name: 'name',
        point: 'point'
      },
      {
        name: 'name2',
        point: 'point2'
      },
      {
        name: 'name2',
        point: 'point2'
      }
    ]
  }
}

function flatten(data, prefix) {
  let result = {}
  for(let d in data) {
    if(typeof data[d] == 'object') Object.assign(result, flatten(data[d], prefix + '.' + d))
    else result[(prefix + '.' + d).replace(/^\./, '')] = data[d]
  }
  return result
}

console.log(flatten(obj, ''))

【讨论】:

    猜你喜欢
    • 2020-06-22
    • 2019-09-26
    • 2021-05-12
    • 2019-05-08
    • 2021-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-02
    相关资源
    最近更新 更多