考虑以下对象:
var content = [
{
id: 'tab1',
langCode: 'en',
title: 'rocket'
},
{
id: 'tab1',
langCode: 'da',
title: 'raket'
},
{
id: 'tab2',
langCode: 'en',
title: 'factory'
},
{
id: 'tab3',
langCode: 'es',
title: 'boligrafo'
},
];
我希望将此数组简化为一个新数组,并遵循以下限制:
- 不含重复ID
- 首选本地语言的值
- 如果没有本地翻译,请回退到英文
- 丢弃所有其他翻译(即使它们具有唯一的ID)
[
{
id: 'tab1',
langCode: 'da',
title: 'raket'
},
{
id: 'tab2',
langCode: 'en',
title: 'factory'
},
];
我的目标是尽可能让代码短小易读,我可以充分利用ES6和Lodash。以下是我的代码:
const LOCAL_LANG = 'da'; // Hard coded for the sake of the example
let localArr = content.filter(item => item.langCode === LOCAL_LANG);
if(LOCAL_LANG !== 'en') {
let enArr = content.filter(item => item.langCode === 'en');
for (let i = 0; i < enArr.length; i++) {
if (!_.find(localArr, { 'id': enArr[i].id})) {
localArr.push(enArr[i]);
}
}
}
这样做虽然能达到效果,但会创建两个重复的数组,然后以我认为有些笨拙的方式将它们合并在一起。我希望看到更优雅的解决方案,最好是不必多次传递数组的方法。
另一个(可能稍微更清晰)的解决方案是在第一次通过时在
langCode ==='da'|| langCode ==='en'
上减小数组,然后删除重复项……但我仍然觉得我错过了最明显的解决方案。谢谢!