2016-09-17 15 views
6

Tôi đang cố gắng làm phẳng đối tượng nơi các phím sẽ là đường dẫn đầy đủ đến nút lá. Tôi có thể xác định đệ quy đó là các nút lá nhưng bị mắc kẹt cố gắng để xây dựng toàn bộ con đường.Đường dẫn đầy đủ của đối tượng json

Sample Input:

 
{ 
    one: 1, 
    two: { 
    three: 3 
    }, 
    four: { 
    five: 5, 
    six: { 
     seven: 7 
    }, 
    eight: 8 
    }, 
    nine: 9 
} 

Output:

 
{ 
    one: 1, 
    'two.three': 3, 
    'four.five': 5, 
    'four.six.seven': 7, 
    'four.eight': 8, 
    nine: 9 
} 
+0

Bạn có thể thấy câu trả lời này: http://stackoverflow.com/questions/19098797/fastest-way-to-flatten-un-flatten-nested-json-objects Hy vọng nó có thể giúp bạn. –

+0

Tại sao bạn muốn điều này? – Victor

+1

@Victor Tôi đang gọi api.moviestore.com/movies?where[movie.name:eq]=gravity. Tôi cần phải làm phẳng một đối tượng để xây dựng truy vấn bộ lọc. – Sayem

Trả lời

9

Bạn có thể sử dụng một approch đệ quy và thu thập các phím của đối tượng. Đề xuất này cũng tìm kiếm các mảng.

function getFlatObject(object) { 
 
    function iter(o, p) { 
 
     if (Array.isArray(o)){ 
 
      o.forEach(function (a, i) { 
 
       iter(a, p.concat(i)); 
 
      }); 
 
      return; 
 
     } 
 
     if (o !== null && typeof o === 'object') { 
 
      Object.keys(o).forEach(function (k) { 
 
       iter(o[k], p.concat(k)); 
 
      }); 
 
      return; 
 
     } 
 
     path[p.join('.')] = o; 
 
    } 
 

 
    var path = {}; 
 
    iter(object, []); 
 
    return path; 
 
} 
 

 
var obj = { one: 1, two: { three: 3 }, four: { five: 5, six: { seven: 7 }, eight: 8 }, nine: 9 }, 
 
    path = getFlatObject(obj); 
 
\t 
 
console.log(path);

0

Sử dụng tính năng mới nhất JS như Object lây lan và Object.entries nó nên được khá dễ dàng:

function flatObj(obj, path = []) { 
    let output = {}; 

    Object.entries(obj).forEach(([ key, value ]) => { 
     const nextPath = [ ...path, key ]; 

     if (typeof value !== 'object') { 
      output[nextPath.join('.')] = value; 

      return; 
     } 

     output = { 
      ...output, 

      ...flatObj(value, nextPath) 
     }; 
    }); 
} 

Xin lưu ý rằng mã này có lẽ không phải là một tối ưu nhất vì nó bản đối tượng mỗi lần chúng ta muốn hợp nhất nó. Đối xử với nó nhiều hơn như một ý chính của nó sẽ trông như thế nào, chứ không phải là một giải pháp hoàn chỉnh và cuối cùng.

0

giải pháp từng phần: Cho đầu vào như một đường dẫn đầy đủ đến các chức năng và nó mang lại cho bạn kết quả tương ứng

var obj = { 
    one: 1, 
    two: { 
    three: 3 
    }, 
    four: { 
    five: 5, 
    six: { 
     seven: 7 
    }, 
    eight: 8 
    }, 
    nine: 9 
}; 

function deepFind(obj, path) { 
    var paths = path.split('.') 
    , current = obj 
    , i; 

    for (i = 0; i < paths.length; ++i) { 
    if (current[paths[i]] == undefined) { 
     return undefined; 
    } else { 
     current = current[paths[i]]; 
    } 
    } 
    return current; 
} 

console.log(deepFind(obj, 'four.six.seven')) 
1

var obj = { 
 
    one: 1, 
 
    two: { 
 
    three: 3 
 
    }, 
 
    four: { 
 
    five: 5, 
 
    six: { 
 
     seven: 7 
 
    }, 
 
    eight: 8 
 
    }, 
 
    nine: 9 
 
}; 
 

 
function flatten(obj) { 
 
    var flatObj = {} 
 

 
    function makeFlat(obj, path) { 
 
    var keys = Object.keys(obj); 
 
    if (keys.length) { 
 
     keys.forEach(function (key) { 
 
     makeFlat(obj[key], (path ? path + "." : path) + key); 
 
     }) 
 
    } else { 
 
     flatObj[path] = obj; 
 
    } 
 
    } 
 
    makeFlat(obj, ""); 
 
    return flatObj; 
 
} 
 

 
console.log(flatten(obj));

0

Một cách tiếp cận không ưa thích, trong nội bộ sử dụng đệ quy.

var x = { one:1,two:{three:3},four:{five: 5,six:{seven:7},eight:8},nine:9}; 
 
var res = {}; 
 
var constructResultCurry = function(src){ return constructResult(res,src); } 
 
     
 
function constructResult(target, src) { 
 
    if(!src) return; 
 
    target[src.key] = src.val; 
 
} 
 
     
 
function buildPath(key, obj, overAllKey) { 
 
    overAllKey += (overAllKey ? "." : "") + key; 
 
    if(typeof obj[key] != "object") return { key : overAllKey, val : obj[key] }; 
 
    Object.keys(obj[key]).forEach(function(keyInner) { 
 
    constructResultCurry(buildPath(keyInner, obj[key], overAllKey)); 
 
    }); 
 
} 
 
     
 
Object.keys(x).forEach(function(k){ 
 
    constructResultCurry(buildPath(k, x, "")); 
 
}); 
 

 
console.log(res);

0

Bạn chỉ có thể làm như sau;

var obj = {one: 1, two: {three: 3}, four: {five: 5, six: {seven: 7}, eight: 8}, nine: 9}, 
 
flatObj = (o,p="") => { return Object.keys(o) 
 
            .map(k => o[k] === null   || 
 
               typeof o[k] !== "object" ? {[p + (p ? ".":"") + k]:o[k]} 
 
                     : flatObj(o[k],p + (p ? ".":"") + k)) 
 
            .reduce((p,c) => Object.assign(p,c)); 
 
         }; 
 
console.log(flatObj(obj));

Các vấn đề liên quan