使用递归和其他方法展平对象和数组

2022-09-27  本文已影响0人  安安_660c

大家好,

你好吗?我决定编写一些我在开发可能对你们也有帮助的东西时发现的代码片段和技巧。

所以今天我将展示一种递归方式来展平数组和对象。这将是一个简短的教程给你们。

使用递归访问嵌套对象。

我们将使用我们定制的递归函数来展平下面的对象。

样本对象


{
  "isbn": "123-456-222",
  "author":
  {
    "lastname": "Doe",
    "firstname": "Jane",
    "address": {
      "street":"3856 Pooz Street",
      "city":"South River",
      "state":"New Jersey",
      "counrty":"United State", 
    }
  },
  "title": "The Ultimate Database Study Guide",
  "category": ["Non-Fiction", "Technology"]
}

递归函数的源代码

const flat_an_object =(object)=>{

  let result = {}

  const recursiveFunction = (obj)=>{
    for (const key in obj){
      if(typeof obj[key] === "object" && 
         Array.isArray(obj[key]) ===false){
        recursiveFunction(obj[key])
      }
      else{
        result ={...result, [key] : obj[key] }
      }
    }
  }
  recursiveFunction(object);
  return result; 
}

您可能会问我为什么Array.isArray()在条件中使用该方法,让我们看看如果我们从 Array 中删除该方法的原因是什么,那么我们将获得什么样的嵌套对象以及该对象将如何展平。

这是扁平化对象的结果。


{
  '0': 'Non-Fiction',
  '1': 'Technology',
  isbn: '123-456-222',
  lastname: 'Doe',
  firstname: 'Jane',
  street: '3856 Pooz Street',
  city: 'South River',
  state: 'New Jersey',
  counrty: 'United State',
  title: 'The Ultimate Database Study Guide'
}

在这里,您可以看到该对象包含一个数组,并且它也被展平了。

使用该 Array.isArray() 方法后,我们将获得扁平对象。现在该对象不再是嵌套对象。

结果:

{
  isbn: '123-456-222',
  lastname: 'Doe',
  firstname: 'Jane',
  street: '3856 Pooz Street',
  city: 'South River',
  state: 'New Jersey',
  counrty: 'United State',
  title: 'The Ultimate Database Study Guide',
  category: [ 'Non-Fiction', 'Technology' ]
}

展平数组或访问嵌套数组

可以应用相同的方法将 Array 展平为我们更改的内容,而不是说typeof Object === "object"我们将使用Array.isArray(key).

让我们看看代码。

样本数组


const sampleArray = [1, 2, 3, [4, 5, 6, [7, 8]]]

为了展平这个数组,我们将只使用我们之前的函数并递归遍历它们。


const flatAnArray = (array) => {

  let result = []

  // Todo : Define a level 

  const recursiveFunction = (arr) => {
    for (const key in arr) {
      if (Array.isArray(arr[key])) {
        recursiveFunction(arr[key])
      }
      else {
        result.push(arr[key])
      }
    }
  }
  recursiveFunction(array);
  return result;
}

我们的代码输出如下,我们扁平化了我们的嵌套数组。

[1, 2, 3, 4,5, 6, 7, 8]

其他扁平化数组的方法。

有几种方法可以在 javascript 中展平嵌套数组,并且一些内置方法是Array.flat()深度无穷大的方法。

const arr = [1, 2, 3, [4, 5, 6, [7, 8]]]

console.log(arr.flat(infinity))

输出 :

[1, 2, 3, 4,5, 6, 7, 8]

展平深度为 1

  1. 使用reduce()
let flatArray = arr.reduce((acc, curVal) => {
    return acc.concat(curVal)
}, []);

console.log(flatArray)

  1. concat()与_apply()
let flatArray1  = [].concat.apply([], arr);

输出:


[ 1, 2, 3, 4, 5, 6, [ 7, 8 ] ]

TL;DR

  1. 通过循环遍历每个属性并检查typeof该属性是否为对象类型,使用递归来扁平化嵌套对象,然后递归循环该对象并继续将结果添加到结果对象。

  2. 在展平嵌套数组的情况下使用Array.flat()方法。

上一篇下一篇

猜你喜欢

热点阅读