上下文:NodeJS项目 我将我的json对象存储在db中,格式如下。
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"}
}
]
我想只将特定于语言环境的值传递给客户端。这意味着如果请求来自法国,我不想在响应JSON中传递 en 和 zh 节点。
有没有更好的方法来过滤键值对而不是遍历所有?建议采用更好的方法?
答案 0 :(得分: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]
});
}
答案 1 :(得分: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 { ... }
});
Map可让您转换对象。
答案 2 :(得分: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:[]});
答案 3 :(得分:0)
您应重组数据:
items: {
en: [
{ name: 'enName', image: 'enImage' },
{ name: 'enName2', image: 'enImage2' }
],
fr: [
{ name: 'frName', image: 'frImage' },
{ name: 'frName2', image: 'frImage2' }
]
}
这样,您只需提取items[country]
即可获取该国家/地区的所有相关项目。