过滤json对象或避免不必要节点的最佳方法

时间:2015-04-07 12:14:49

标签: javascript arrays json node.js

上下文: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 节点。

有没有更好的方法来过滤键值对而不是遍历所有?建议采用更好的方法?

4 个答案:

答案 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]即可获取该国家/地区的所有相关项目。