2016-12-23 90 views
1

我有這樣的JavaScript對象:減少JavaScript對象

{ 
    { 
     long_name: "10", 
     types: [ 
      0: "street_number" 
     ], 
    }, 
    { 
     long_name: "street", 
     types: [ 
      0: "route" 
     ], 
    }, 
    { 
     long_name: "Paris", 
     types: [ 
      0: "locality" 
     ], 
    }, 
    ... 
} 

我要壓平,並有類似:

{ 
    street_number: "10", 
    route: "street", 
    locality: "Paris", 
    ... 
} 

我使用ES6,但不能設法弄平多這一點, 所有我已經成功做是有:

{ 
    {street_number: "10"}, 
    {route: "street"}, 
    {locality: "Paris"}, 
    ... 
} 

這裏是我的嘗試:

const flattenedObject = originalObject.map(flatten); 
... 
function flatten(element) { 
    let obj = {}; 
    obj[element.types[0]] = element.long_name; 

    return obj; 
} 

感謝您的任何幫助。

+0

你可以使用像這樣的東西:https://lodash.com/ Lodash有一大套相當有用的功能,包括'flatten'。 – smddzcy

+0

將'let obj = {}'放在'flatten'方法外,因爲這是您想要擴展的對象。目前,您正在爲每個數組項目構建一個新的。 –

+0

@SamedDüzçay但這沒有做那種扁平化是lodash'_.flatten'做的。 –

回答

4

您可以將Array#reducecomputed property和第一個元素只從數組中使用。

的關鍵特徵是用於Object.assign添加屬性的結果對象。

Object.assign()方法用於從一個或多個源對象中所有可枚舉自己的屬性的值複製到目標對象。它會返回目標對象。

var data = [{ long_name: "10", types: ["street_number"], }, { long_name: "street", types: ["route"], }, { long_name: "Paris", types: ["locality"], }], 
 
    object = data.reduce((r, a) => Object.assign(r, { [a.types[0]]: a.long_name }), {}); 
 

 
console.log(object);

+0

這是什麼做data.reduce((R,A) –

+0

@sacDahal,['陣列#reduce'(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ Array/reduce)接受一個數組並通過處理該數組的所有項來返回一個值。 –

2

所有我已經成功做是有:

{ 
    {street_number: "10"}, 
    {route: "street"}, 
    {locality: "Paris"}, 
    ... 
} 

我怎麼沒有你得到那個 「成功」,因爲JS中不存在這樣的對象(您的原始對象也不存在)。您的意思是把[]圍繞它,而不是{}(換句話說,就是它的小對象的數組)?如果是這樣,然後用

Object.assign({}, ...littleObjects) 

結合順便說一句,你可以稱之爲「扁平化」,如果你想要的,但它會是混亂的,因爲它是從什麼人們通常所說的「扁平化」完全不同的(意思摺疊嵌套數組)。