2017-08-30 98 views
1

我有一個對象,有幾個值我想要提取並放置到另一個對象具有不同的鍵值爲這些值。現在我正在使用解構來提取值,然後用這些提取的值和它們的新密鑰定義一個對象文字。對象聲明中的對象解構?

這裏是我的功能:

getProductReviewData() { 
    const { 
     averageRateDisplay, 
     rawAverageRate, 
     displayReviewCount, 
     productReviewIds, 
     productReviews 
    } = this.productReviewsStore.getAll(); // this is deconstruction of an object 
    return { 
     ratingDisplay: averageRateDisplay, 
     rating: rawAverageRate, 
     ratingCount: displayReviewCount, 
     reviewIds: productReviewIds, 
     reviewMap: productReviews 
    }; 
} 

不過,我在想,如果是要做到這一點,所以用一條線的解構和聲明都的簡便方法。有誰知道這是否可能?

+0

您可以*總是*將所有東西放在同一條線上,但您確實不應該。 – Bergi

回答

4

I don't think there's anything to put them in the same statement,特別是與重命名。你當然可以編寫你自己的幫助函數來重命名對象屬性。

我認爲這將是更清潔,雖然該對象多次分配給一個變量,然後重複,不是重複每個屬性/變量名兩次:

getProductReviewData() { 
    const all = this.productReviewsStore.getAll(); 
    return { 
     ratingDisplay: all.averageRateDisplay, 
     rating:  all.rawAverageRate, 
     ratingCount: all.displayReviewCount, 
     reviewIds:  all.productReviewIds, 
     reviewMap:  all.productReviews 
    }; 
} 

你也可以使用解構爲對象的屬性如果你交換雙方這樣的好:

getProductReviewData() { 
    let res = {}; 
    ({ 
     averageRateDisplay: res.ratingDisplay, 
     rawAverageRate:  res.rating, 
     displayReviewCount: res.ratingCount, 
     productReviewIds: res.reviewIds, 
     productReviews:  res.reviewMap 
    } = this.productReviewsStore.getAll()); 
    return res; 
} 

1:我個人認爲這只是不必要的混亂 - 一線更長!

+0

我只是想到了這一點,Ironic認爲縮短它的最好方法是不使用es6或obj解構 –

+0

@NilesTanner嘿,至少'const'仍然是ES6 :-D – Bergi

0

UPD:簡單比複雜更好!我喜歡Bergi's answer =)

也許你可以聲明新的密鑰,然後更改它們在迭代_(ツ)_ /¯

getProductReviewData() { 
    //declare new keys 
    const newKeys = { 
     averageRateDisplay: "ratingDisplay", 
     rawAverageRate:  "rating", 
     displayReviewCount: "ratingCount", 
     productReviewIds: "reviewIds", 
     productReviews:  "reviewMap" 
    } 
    const productReviewsStore = this.productReviewsStore.getAll(); 

    //return the object with replaced keys 
    return Object.assign({}, 
     ...Object.keys(productReviewsStore) 
      .filter(key => newKeys[key]) 
      .map(key => ({[newKeys[key]]: productReviewsStore[key]})) 
    ) 
} 
0

可以解構和一次性給予新的鍵/變量值。但據我所知,你不能直接解構一個新的對象。

const start = { 
    averageRateDisplay: 1, 
    rawAverageRate: 2, 
    displayReviewCount: 3, 
    productReviewIds: 4, 
    productReviews: 5 
}; 

// destructuring with renaming of variables 
const { 
    // name to match : newName 
    averageRateDisplay: ratingDisplay, 
    rawAverageRate: rating, 
    displayReviewCount: ratingCount, 
    productReviewIds: reviewIds, 
    productReviews: reviewMap 
} = start; 

// creating new object, using property value shorthand 
// https://ariya.io/2013/02/es6-and-object-literal-property-value-shorthand 
const end = { 
    ratingDisplay, 
    rating, 
    ratingCount, 
    reviewIds, 
    reviewMap 
}; 

console.log(end)