2015-04-07 17 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' } 
    ] 
} 

这样你只需要拉​​就可以获得该国的所有相关项目。