首页 > 解决方案 > 如何从 JSON 结构中删除相同的命名对象,但结构中的模式不统一?

问题描述

我有一个 json 结构,有点奇怪,这是从远程设备返回的,我必须按原样接受它。例如...

{"_":"e6a7f749","4321013c":{"_":"5d839a60"},"67ea44a0":{"_":"ec7500f9"},"6bea5f08":{"_":"ecdaead4"},"1e92311e":{"_":"5348dab3"}}

我需要删除“_”键值对,但保留其他所有内容,这样......

{"4321013c":,"67ea44a0":,"6bea5f08":,"1e92311e":,}

如您所见,这仅从原始结构中留下了一些“键”。然后我想将“键”转换为一个简单的值数组。这样的...

["4321013c","67ea44a0","6bea5f08","1e92311e"]

顺便说一句,所有这些都是在 node.js (JavaScript) 中完成的。

标签: node.jsjson

解决方案


这是我的解决方案。我不确定我是否完全理解了这个问题。

但是在这里我遍历对象,将所有键和值收集到另一个扁平对象中。最后,我在上面运行 Object.keys 并删除任何“_”值。


const obj = {
  "_":"e6a7f749",
  "4321013c":{"_":"5d839a60"},
  "67ea44a0":{"_":"ec7500f9"},
  "6bea5f08":{"_":"ecdaead4"},
  "1e92311e":{"_":"5348dab3"}
  };


const collectValues = (root) => {
    return Object.keys(root).reduce((map, key) => {
      const value = root[key];
      if (typeof value === 'string') {
        map = {
          ...map, 
          [key]: true, 
          [value]: true
        };
      } else {
        const nestedValues = collectValues(root[key]);
        map = {
          ...map, 
          ...nestedValues, 
          [key]: true
        };
      }
      return map;
    }, {});
}

const uniqueArray = Object.keys(collectValues(obj)).filter(v => v !== '_');

console.log(uniqueArray);

推荐阅读