2015-04-07 44 views
0

上下文:NodeJS項目 我有我的json對象存儲在db像下面的格式。過濾json對象或避免不必要的節點的最佳方法

items:[ 
{name : {"en" : "enName", "fr" : "frName", "zh" : "zhName"}, 
image :{"en" : "enImage", "fr" : "frImage", "zh" : "zhImage"} 
}, 
{name : {"en" : "enName", "fr" : "frName", "zh" : "zhName"}, 
image :{"en" : "enImage", "fr" : "frImage", "zh" : "zhImage"} 
}, 
{name : {"en" : "enName", "fr" : "frName", "zh" : "zhName"}, 
image :{"en" : "enImage", "fr" : "frImage", "zh" : "zhImage"} 
} 
] 

我只想將特定於語言環境的值傳遞給客戶端。這意味着如果請求來自法國我不想通過enzh節點響應JSON。

是否有更好的方法來過濾鍵值對而不是遍歷所有?建議採取更好的方法?

+2

你必須迭代某些點來修改列表,我會建議使用'map':https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map –

+0

爲每種語言創建單區域JSON後,* cache *結果,以便您不必爲每個請求運行完全相同的代碼。並改進客戶端,以便確定要使用哪種語言並專門要求它;在服務器上它應該是一個靜態資源。 – Touffy

回答

0

你應該用你想要的值創建一個新的JSON對象。下面是一些這方面的例子代碼:

注:如果您使用MongoDB的,你應該使用aggregation framework ...

此代碼是JS的工作,但你真的需要使用數據庫引擎本身。

var newList = []; 
var locale = getLocale(); // made up function to find ISO country code, e.g. en, fr 

for (var i = 0; i < items.length; i++) { 
    newList.push(
     { 
      name: items[i]['name'][locale] 
      image: items[i]['image'][locale] 
     }); 
} 
0

地圖應該這樣做:

var locale = getLocale(); 
var res = items.map(function (item) { 
    if (locale === 'en') { 
     return { 
      name: { 'en': item.name.en }, 
      image: { 'en': item.image.en } 
     } 
    } else if { ... } 
}); 

地圖可以讓你變換對象。

+0

沒有理由使用多個if語句,您可以使用locale作爲對象的關鍵字。 – Alex

0

使用JSON結構看起來像這個:

itemsByLocale:{ 
    "en": [{name:"enName", image:"enImage"}, {name:"enName", image:"enImage"}, ...] 
    "fr": [{name:"frName", image:"frImage"}, {name:"frName", image:"frImage"}, ...] 
    "zh": [{name:"zhName", image:"zhImage"}, {name:"zhName", image:"zhImage"}, ...] 
} 

如果不控制它,你可以從你的東西像這樣(未經測試有一次什麼產生的,它應該一概而論獲得從JSON的語言環境):

var itemsByLocale = items.reduce(function (memo, item) { 
    Object.keys(memo).forEach(function (locale) { 
    memo[locale].push({name: item.name[locale], image: item.image[locale]}); 
    }); 
    return memo; 
}, {en:[], fr:[], zh:[]}); 
0

你應該調整你的數據:

items: { 
    en: [ 
    { name: 'enName', image: 'enImage' }, 
    { name: 'enName2', image: 'enImage2' } 
    ], 
    fr: [ 
    { name: 'frName', image: 'frImage' }, 
    { name: 'frName2', image: 'frImage2' } 
    ] 
} 

這樣你只需要拉​​就可以獲得該國的所有相關項目。