【问题标题】:Get all unique key from nested object从嵌套对象中获取所有唯一键
【发布时间】:2018-12-06 03:40:25
【问题描述】:

我有这个对象:

{
  "apple": {
    "0": {
      "2018-04-25 19:51:38": {
        "x": "38.0",
        "y": "23.0"
      },
      "2018-04-25 19:51:39": {
        "x": "NaN",
        "y": "NaN"
      },
      "2018-04-25 19:51:40": {
        "x": "NaN",
        "y": "NaN"
      }
    },
    "5": {
      "2018-04-25 19:51:38": {
        "x": "50.0",
        "y": "35.0"
      },
      "2018-04-25 19:51:43": {
        "x": "21.0",
        "y": "3.0"
      }
    },
    "6": {
      "2018-04-25 19:51:34": {
        "x": "30.0",
        "y": "15.0"
      },
      "2018-04-25 19:51:39": {
        "x": "NaN",
        "y": "NaN"
      },
      "2018-04-25 19:52:40": {
        "x": "22.0",
        "y": "20.0"
      },
      "2018-04-25 19:52:42": {
        "x": "33.0",
        "y": "45.0"
      }
    }
  },
  "team": {
    "2": {
      "2018-04-25 19:51:35": {
        "x": "32.0",
        "y": "25.0"
      },
      "2018-04-25 19:51:36": {
        "x": "33.0",
        "y": "40.0"
      },
      "2018-04-25 19:51:37": {
        "x": "12.0",
        "y": "24.0"
      },
      "2018-04-25 19:51:38": {
        "x": "33.0",
        "y": "45.0"
      }
    },
    "3": {
      "2018-04-25 19:51:35": {
        "x": "2.0",
        "y": "3.0"
      },
      "2018-04-25 19:51:36": {
        "x": "4.0",
        "y": "5.0"
      },
      "2018-04-25 19:51:37": {
        "x": "12.0",
        "y": "15.0"
      },
      "2018-04-25 19:51:38": {
        "x": "33.0",
        "y": "45.0"
      }
    },
    "4": {
      "2018-04-25 19:51:35": {
        "x": "20.0",
        "y": "30.0"
      },
      "2018-04-25 19:51:36": {
        "x": "41.0",
        "y": "35.0"
      },
      "2018-04-25 19:51:37": {
        "x": "32.0",
        "y": "65.0"
      },
      "2018-04-25 19:51:38": {
        "x": "43.0",
        "y": "49.0"
      }
    },
    "5": {
      "2018-04-25 19:51:35": {
        "x": "21.0",
        "y": "33.0"
      },
      "2018-04-25 19:51:36": {
        "x": "31.0",
        "y": "12.0"
      },
      "2018-04-25 19:51:37": {
        "x": "34.0",
        "y": "54.0"
      },
      "2018-04-25 19:51:38": {
        "x": "93.0",
        "y": "22.0"
      }
    }
  }
}

我想要的是两个唯一时间戳数组:一个用于apple,一个用于team。 所以:

const appleTimestamps = ["2018-04-25 19:51:34", "2018-04-25 19:51:37", "2018-04-25 19:51:38", "2018-04-25 19:51:39", "2018-04-25 19:51:40", "2018-04-25 19:51:43", "2018-04-25 19:52:40", "2018-04-25 19:52:42"]
const teamTimestamps = ["2018-04-25 19:51:35", "2018-04-25 19:51:36", "2018-04-25 19:51:37", "2018-04-25 19:51:38"]

如您所见,Apple 和团队内部的密钥不是连续的。 我怎样才能做到这一点?我认为唯一的方法是使用find,但我确定我错了。

(我也可以使用 Lodash

【问题讨论】:

    标签: javascript object unique lodash


    【解决方案1】:

    大概是这样的:

    const timestamps = obj => 
      [...new Set(
        Object.values(obj)
          .map(Object.keys)
          .reduce((a, b) => a.concat(b), []) // someday: `flatten`
      )]
    
    
    const obj = {"apple": {"0": {"2018-04-25 19:51:38": {"x": "38.0", "y": "23.0"}, "2018-04-25 19:51:39": {"x": "NaN", "y": "NaN"}, "2018-04-25 19:51:40": {"x": "NaN", "y": "NaN"}}, "5": {"2018-04-25 19:51:38": {"x": "50.0", "y": "35.0"}, "2018-04-25 19:51:43": {"x": "21.0", "y": "3.0"}}, "6": {"2018-04-25 19:51:34": {"x": "30.0", "y": "15.0"}, "2018-04-25 19:51:39": {"x": "NaN", "y": "NaN"}, "2018-04-25 19:52:40": {"x": "22.0", "y": "20.0"}, "2018-04-25 19:52:42": {"x": "33.0", "y": "45.0"}}}, "team": {"2": {"2018-04-25 19:51:35": {"x": "32.0", "y": "25.0"}, "2018-04-25 19:51:36": {"x": "33.0", "y": "40.0"}, "2018-04-25 19:51:37": {"x": "12.0", "y": "24.0"}, "2018-04-25 19:51:38": {"x": "33.0", "y": "45.0"}}, "3": {"2018-04-25 19:51:35": {"x": "2.0", "y": "3.0"}, "2018-04-25 19:51:36": {"x": "4.0", "y": "5.0"}, "2018-04-25 19:51:37": {"x": "12.0", "y": "15.0"}, "2018-04-25 19:51:38": {"x": "33.0", "y": "45.0"}}, "4": {"2018-04-25 19:51:35": {"x": "20.0", "y": "30.0"}, "2018-04-25 19:51:36": {"x": "41.0", "y": "35.0"}, "2018-04-25 19:51:37": {"x": "32.0", "y": "65.0"}, "2018-04-25 19:51:38": {"x": "43.0", "y": "49.0"}}, "5": {"2018-04-25 19:51:35": {"x": "21.0", "y": "33.0"}, "2018-04-25 19:51:36": {"x": "31.0", "y": "12.0"}, "2018-04-25 19:51:37": {"x": "34.0", "y": "54.0"}, "2018-04-25 19:51:38": {"x": "93.0", "y": "22.0"}}}}
    
    console.log(timestamps(obj.apple))
    console.log(timestamps(obj.team))

    Object.valuesObject.keys 提供了很好的方法来遍历这样的对象。 Set 是确保唯一性的规范方法。

    【讨论】:

      【解决方案2】:

      您可以参考以下代码。如果有多个对象,例如 apple, sets,那么您可以将代码移动到函数中,而不是一次又一次地编写。

      var obj = {
        "apple": {
          "0": {
            "2018-04-25 19:51:38": {
              "x": "38.0",
              "y": "23.0"
            },
            "2018-04-25 19:51:39": {
              "x": "NaN",
              "y": "NaN"
            },
            "2018-04-25 19:51:40": {
              "x": "NaN",
              "y": "NaN"
            }
          },
          "5": {
            "2018-04-25 19:51:38": {
              "x": "50.0",
              "y": "35.0"
            },
            "2018-04-25 19:51:43": {
              "x": "21.0",
              "y": "3.0"
            }
          },
          "6": {
            "2018-04-25 19:51:34": {
              "x": "30.0",
              "y": "15.0"
            },
            "2018-04-25 19:51:39": {
              "x": "NaN",
              "y": "NaN"
            },
            "2018-04-25 19:52:40": {
              "x": "22.0",
              "y": "20.0"
            },
            "2018-04-25 19:52:42": {
              "x": "33.0",
              "y": "45.0"
            }
          }
        },
        "team": {
          "2": {
            "2018-04-25 19:51:35": {
              "x": "32.0",
              "y": "25.0"
            },
            "2018-04-25 19:51:36": {
              "x": "33.0",
              "y": "40.0"
            },
            "2018-04-25 19:51:37": {
              "x": "12.0",
              "y": "24.0"
            },
            "2018-04-25 19:51:38": {
              "x": "33.0",
              "y": "45.0"
            }
          },
          "3": {
            "2018-04-25 19:51:35": {
              "x": "2.0",
              "y": "3.0"
            },
            "2018-04-25 19:51:36": {
              "x": "4.0",
              "y": "5.0"
            },
            "2018-04-25 19:51:37": {
              "x": "12.0",
              "y": "15.0"
            },
            "2018-04-25 19:51:38": {
              "x": "33.0",
              "y": "45.0"
            }
          },
          "4": {
            "2018-04-25 19:51:35": {
              "x": "20.0",
              "y": "30.0"
            },
            "2018-04-25 19:51:36": {
              "x": "41.0",
              "y": "35.0"
            },
            "2018-04-25 19:51:37": {
              "x": "32.0",
              "y": "65.0"
            },
            "2018-04-25 19:51:38": {
              "x": "43.0",
              "y": "49.0"
            }
          },
          "5": {
            "2018-04-25 19:51:35": {
              "x": "21.0",
              "y": "33.0"
            },
            "2018-04-25 19:51:36": {
              "x": "31.0",
              "y": "12.0"
            },
            "2018-04-25 19:51:37": {
              "x": "34.0",
              "y": "54.0"
            },
            "2018-04-25 19:51:38": {
              "x": "93.0",
              "y": "22.0"
            }
          }
        }
      };
      
      var k = [];
      Object.keys(obj.apple).forEach((el)=>{
      	k = k.concat(Object.keys(obj.apple[el]));
      });
      var appleTimeStamps = new Set(k);
      appleTimeStamps = Array.from(appleTimeStamps);
      console.log(appleTimeStamps);
      
      var j = [];
      Object.keys(obj.team).forEach((el)=>{
      	j = j.concat(Object.keys(obj.team[el]));
      });
      var teamTimeStamps = new Set(j);
      teamTimeStamps = Array.from(teamTimeStamps);
      console.log(teamTimeStamps);

      【讨论】:

        【解决方案3】:

        使用lodash,你可以使用_.flow()创建函数:

        1. _.flatMap()_.keys() 获取时间戳数组
        2. _.uniq() 删除重复项

        const timestamps = _.flow([
          o => _.flatMap(o, _.keys),
          _.uniq,
        ])
        
        const obj = {"apple": {"0": {"2018-04-25 19:51:38": {"x": "38.0", "y": "23.0"}, "2018-04-25 19:51:39": {"x": "NaN", "y": "NaN"}, "2018-04-25 19:51:40": {"x": "NaN", "y": "NaN"}}, "5": {"2018-04-25 19:51:38": {"x": "50.0", "y": "35.0"}, "2018-04-25 19:51:43": {"x": "21.0", "y": "3.0"}}, "6": {"2018-04-25 19:51:34": {"x": "30.0", "y": "15.0"}, "2018-04-25 19:51:39": {"x": "NaN", "y": "NaN"}, "2018-04-25 19:52:40": {"x": "22.0", "y": "20.0"}, "2018-04-25 19:52:42": {"x": "33.0", "y": "45.0"}}}, "team": {"2": {"2018-04-25 19:51:35": {"x": "32.0", "y": "25.0"}, "2018-04-25 19:51:36": {"x": "33.0", "y": "40.0"}, "2018-04-25 19:51:37": {"x": "12.0", "y": "24.0"}, "2018-04-25 19:51:38": {"x": "33.0", "y": "45.0"}}, "3": {"2018-04-25 19:51:35": {"x": "2.0", "y": "3.0"}, "2018-04-25 19:51:36": {"x": "4.0", "y": "5.0"}, "2018-04-25 19:51:37": {"x": "12.0", "y": "15.0"}, "2018-04-25 19:51:38": {"x": "33.0", "y": "45.0"}}, "4": {"2018-04-25 19:51:35": {"x": "20.0", "y": "30.0"}, "2018-04-25 19:51:36": {"x": "41.0", "y": "35.0"}, "2018-04-25 19:51:37": {"x": "32.0", "y": "65.0"}, "2018-04-25 19:51:38": {"x": "43.0", "y": "49.0"}}, "5": {"2018-04-25 19:51:35": {"x": "21.0", "y": "33.0"}, "2018-04-25 19:51:36": {"x": "31.0", "y": "12.0"}, "2018-04-25 19:51:37": {"x": "34.0", "y": "54.0"}, "2018-04-25 19:51:38": {"x": "93.0", "y": "22.0"}}}}
        
        console.log(timestamps(obj.apple))
        console.log(timestamps(obj.team))
        <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2023-01-15
          • 1970-01-01
          • 2018-04-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多