如何从键和值获取javascript对象的路径
我有一个javascript对象宽度深度 我需要知道对象中该键的确切路径,例如:“obj1.obj2.data1” 我已经知道键是data1,值是123 我的javascript对象如下所示如何从键和值获取javascript对象的路径,javascript,object,Javascript,Object,我有一个javascript对象宽度深度 我需要知道对象中该键的确切路径,例如:“obj1.obj2.data1” 我已经知道键是data1,值是123 我的javascript对象如下所示 { obj1: { obj2: { data1: 213, data2: "1231", obj3: { data: "milf" } }
{
obj1: {
obj2: {
data1: 213,
data2: "1231",
obj3: {
data: "milf"
}
}
},
obj4: {
description: "toto"
}
}
我怎样才能做到这一点
下面是一个JSFIDLE:
我正在尝试实现getPath。我强烈建议您使用它来解决此问题 在他们的文件中
我认为递归函数可以帮助你(更新版本,检查值)
函数路径(c,name,v,currentPath,t){
var currentPath=currentPath | |“根”;
用于(c中的变量i){
如果(i==name&&c[i]==v){
t=电流路径;
}
else if(c[i]=“对象”的类型){
返回路径(c[i],名称,v,currentPath+“+i);
}
}
返回t+“+”名称;
};
log(路径({1:2,s:5,2:{3:{2:{s:1,p:2}}}},“s”,1))代码>给你
function getPath(obj, value, path) {
if(typeof obj !== 'object') {
return;
}
for(var key in obj) {
if(obj.hasOwnProperty(key)) {
console.log(key);
var t = path;
var v = obj[key];
if(!path) {
path = key;
}
else {
path = path + '.' + key;
}
if(v === value) {
return path;
}
else if(typeof v !== 'object'){
path = t;
}
var res = getPath(v, value, path);
if(res) {
return res;
}
}
}
}
getPath(yourObject, valueYouWantToFindPath);
如果找到,则重新运行路径,否则返回未定义。
我只使用对象测试过它&比较非常严格(即:使用==
)
更新:
以key作为参数的更新版本
function getPath(obj, key, value, path) {
if(typeof obj !== 'object') {
return;
}
for(var k in obj) {
if(obj.hasOwnProperty(k)) {
console.log(k);
var t = path;
var v = obj[k];
if(!path) {
path = k;
}
else {
path = path + '.' + k;
}
if(v === value) {
if(key === k) {
return path;
}
else {
path = t;
}
}
else if(typeof v !== 'object'){
path = t;
}
var res = getPath(v, key, value, path);
if(res) {
return res;
}
}
}
}
getPath(yourObject, key, valueYouWantToFindPath);
JSON对象可以在JavaScript中作为关联数组处理
因此,您可以在某些变量中循环并存储“父对象”的索引
假设整个对象存储在名为obj的变量中
用于(obj中的变量p1)
{
}
希望答案是有帮助的。我会做以下工作
Object.prototype.paths=函数(根=[],结果={}){
var ok=Object.keys(这个);
返回ok.reduce((res,key)=>{var path=root.concat(key);
此[键]=“对象”的类型&&
此[键]!==null?此[键]。路径(路径,分辨率)
:res[this[key]==0 | | res[this[key]]?res[this[key]]。推送(路径)
:res[this[key]]=[path];
返回res;
},结果);
};
var myObj={
obj1:{
obj2:{
数据1:213,,
数据2:“1231”,
obj3:{
数据:“米尔夫”
}
}
},
obj4:{
描述:“toto”,
美洲狮:“乔迪”,
类别:“米尔夫”
}
},
value=“milf”,
milfPath=myObj.paths()[value];//该值可以动态设置,如果存在,将列出其路径。
console.log(milfPath)代码>以下命令可在任何级别的嵌套对象中查找路径。还有数组。
它返回找到的所有路径,如果您有同名的键,则需要这些路径
我喜欢这种方法,因为它可以与lodash
方法get
和set
一起使用
function findPathsToKey(options) {
let results = [];
(function findKey({
key,
obj,
pathToKey,
}) {
const oldPath = `${pathToKey ? pathToKey + "." : ""}`;
if (obj.hasOwnProperty(key)) {
results.push(`${oldPath}${key}`);
return;
}
if (obj !== null && typeof obj === "object" && !Array.isArray(obj)) {
for (const k in obj) {
if (obj.hasOwnProperty(k)) {
if (Array.isArray(obj[k])) {
for (let j = 0; j < obj[k].length; j++) {
findKey({
obj: obj[k][j],
key,
pathToKey: `${oldPath}${k}[${j}]`,
});
}
}
if (obj[k] !== null && typeof obj[k] === "object") {
findKey({
obj: obj[k],
key,
pathToKey: `${oldPath}${k}`,
});
}
}
}
}
})(options);
return results;
}
findPathsToKey({ obj: objWithDuplicates, key: "d" })
// ["parentKey.arr[0].c.d", "parentKey.arr[1].c.d", "parentKey.arr[2].c.d"]
函数findPathsToKey(选项){
让结果=[];
(函数findKey)({
钥匙
obj,
可怜的,
}) {
constoldpath=${pathToKey?pathToKey+”:“}”;
if(对象hasOwnProperty(键)){
push(`${oldPath}${key}`);
返回;
}
if(obj!==null&&typeof obj===“object”&&&!Array.isArray(obj)){
用于(对象中的常数k){
if(对象hasOwnProperty(k)){
if(Array.isArray(obj[k])){
for(设j=0;j
在这里试试-
如果希望结果是单个键(第一次遇到),可以将结果更改为字符串,如果已定义,则返回包含该结果的函数。我最后使用了以下用于嵌套对象/数组的函数:
函数findPath(对象、名称、值、当前路径){
currentPath=currentPath | |“”
让匹配路径
如果(!obj | | typeof obj!=“object”)返回
if(obj[name]==val)返回`${currentPath}['${name}']`
for(对象的常量键。键(obj)){
if(key==名称和对象[key]==值){
匹配路径=当前路径
}否则{
matchingPath=findPath(obj[key],name,val,`${currentPath}['${key}']`)
}
如果(匹配路径)中断
}
返回匹配路径
}
常数treeData=[{
id:1,
儿童:[{
身份证号码:2
}]
}, {
id:3,
儿童:[{
id:4,
儿童:[{
身份证号码:5
}]
}]
}]
console.log(findPath(treeData,'id',5))
这样做的目的是什么?它是为了实现一个变更日志,如果我们能像现在这样做的话,它会变得更容易。它是为了mongodb更新吗?@TamilVendhan不是,它是为了从一个版本到另一个版本的json变更日志another@Prinzhorn我正在研究一个现有的系统,不需要重新实现所有逻辑。我不能实现一个新的库,这需要几个月的测试。请不要给我提供更多的替代解决方案,提琴只是为了展示我正在努力实现的目标。这不会返回我需要的路径。为什么您需要该路径?我需要保存原始门店位置的参考,但是,我的意思是,您想用它做什么?如果它是一个静态路径,你可以很容易地手动找到它,如果它是动态的,我看不出保存它的意义。它可以是动态的,我刚刚添加了一个JSFIDDLE谢谢,我在我的小提琴中尝试了你的fn,你在这个函数中缺少了一个参数,我们知道原始对象,我们知道我们是l的键
for( var p2 in obj[ p1 ] )
{
for( var p3 in obj[ p1 ][ p2 ] )
{
// obj[ p1 ][ p2 ][ p3 ] is current node
// so for Your example it is obj.obj1.obj2.data1
}
}
function findPathsToKey(options) {
let results = [];
(function findKey({
key,
obj,
pathToKey,
}) {
const oldPath = `${pathToKey ? pathToKey + "." : ""}`;
if (obj.hasOwnProperty(key)) {
results.push(`${oldPath}${key}`);
return;
}
if (obj !== null && typeof obj === "object" && !Array.isArray(obj)) {
for (const k in obj) {
if (obj.hasOwnProperty(k)) {
if (Array.isArray(obj[k])) {
for (let j = 0; j < obj[k].length; j++) {
findKey({
obj: obj[k][j],
key,
pathToKey: `${oldPath}${k}[${j}]`,
});
}
}
if (obj[k] !== null && typeof obj[k] === "object") {
findKey({
obj: obj[k],
key,
pathToKey: `${oldPath}${k}`,
});
}
}
}
}
})(options);
return results;
}
findPathsToKey({ obj: objWithDuplicates, key: "d" })
// ["parentKey.arr[0].c.d", "parentKey.arr[1].c.d", "parentKey.arr[2].c.d"]