【问题标题】:Filtering json in javascript/typescript [closed]在 javascript/typescript 中过滤 json [关闭]
【发布时间】:2021-04-23 17:25:29
【问题描述】:

我有一个json,如下所示。

const d = {
data:{name:"name1", type:"abc"},
parent:{
    data: {name:"parent1"},
    parent:{
      data: { name:"superparent1"},
      parent: null
     }  
  }
}

我想在数组中获得最终输出为“superparent1 / parent1 / name1”。它应该显示父级,直到父级为空。我该怎么做?

【问题讨论】:

  • 你能显示输出的例子吗,因为我不明白你的意思?
  • 你想打印一个字符串superparent1 / parent1 / name1从空父对象到最外层对象的名字吗?
  • @RohitKhandelwal 在数组中,因为这只是一个示例。在运行时数据可能很大
  • 我投票决定关闭它,直到您能够澄清确切的输入和预期的输出。
  • 请不要关闭。这是一个简单的问题,我有一个 json,并且还提到了我想要的输出。你可以看到他理解正确的 Rohit 评论

标签: javascript angular angular8 angular9


【解决方案1】:

const d = {
  data: {
    name: "name1",
    type: "abc"
  },
  parent: {
    data: {
      name: "parent1"
    },
    parent: {
      data: {
        name: "superparent1"
      },
      parent: null
    }
  }
}
const d1 = {
  data: {
    name: "name1",
    type: "abc"
  },
  parent: {
    data: {
      name: "parent1"
    },
    parent: {
      data: {
        name: "superparent1"
      },
      parent: null
    }
  }
}

const resArr = [];

const formatFunc = (obj, arr) => {
  if (obj) {
    arr.push(obj.data.name);
    return formatFunc(obj.parent, arr);
  } else {
    return "end";
  }
}

const formatArrObj = (arr) => {
  let iArr = [];
  arr.map(item => {
    formatFunc(item, iArr);
    const str = iArr.reverse().join("/");
    resArr.push(str);
    iArr = [];
  })
}

formatArrObj([d, d1]);

console.log(resArr);

这就是你要找的吗?

【讨论】:

  • [superparent1 / parent1 / name1] 类似这样的
  • 我已经编辑了答案,现在它将输出您需要的内容。 @RAZZZ
  • 只是您解决方案中的一个问题。假设使用 d 我有 d1(表示而不是 d,如果我有一个数组包含 d 和 d1(arr[d,d1])) 在数组 [uperparent1 / parent1 / name1,uperparent2 / parent2 / name2]] 等等我该怎么做?
  • 我怎样才能得到上面评论中提到的逗号分隔的输出
  • 嘿,Rohit,你可以更新你的答案吗?
【解决方案2】:

使用递归方法,您可以执行以下操作:

const filter = (a) => {
    if(a.parent == null) {
      return [a.data.name];
    } else {
      return [...filter(a.parent), a.data.name];
  }
}

您可以在必要时添加适当的打字稿类型。

【讨论】:

    【解决方案3】:

    看来你需要一些这样的代码:

    const output = [];
    const getParent = (obj) => {
        output.push(obj.data.name)
    
        if (!obj.parent) {
            return 
        }
    
        return getParent(obj.parent)
    }
    getParent(d);
    const formattedOutput = output.reverse().join(' / ');
    

    【讨论】:

    • 只是您解决方案中的一个问题。假设使用 d 我有 d1(表示而不是 d,如果我有一个包含 d 和 d1(arr[d,d1])) 的数组在一个数组 [uperparent1 / parent1 / name1,uperparent2 / parent2 / name2]] 等等我该怎么做?我怎样才能得到上面评论中提到的逗号分隔的输出
    • 你可以创建另一个数组,假设 const finalOut = [],然后使用 [d0, d1, d2].forEach(d => { const output = []; ...我的代码... getParent(d); finalOut.push(formattedOutput) } )
    • 能否请您在上面添加您的代码而不是评论?
    • 我试过你的代码,它给出了错误的输出。对于第一个元素给出正确的输出 [superparent1 / parent1 / name1] 但对于第二个元素 [uperparent2 / parent2 / name2/superparent1 / parent1 / name1] 和第三个元素更错误
    猜你喜欢
    • 2016-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-21
    • 2021-05-29
    • 2019-08-10
    • 1970-01-01
    • 2019-10-02
    相关资源
    最近更新 更多