根据匹配的阿拉伯字母显示产品列表?

时间:2017-06-16 21:09:31

标签: javascript arrays arabic

我想根据匹配的阿拉伯字母显示对象列表,我有一个arabic字母数组和具有值和属性的对象数组,我想根据匹配的阿拉伯字母显示对象

我正在使用ES2015 .map.filter辅助方法,任何人都可以帮我解决问题,提前致谢

JSON API

 const ar_alpha = ['ا', 'ب', 'پ', 'ت', 'ث', 'ج', 'چ', 'ح', 'خ', 'د', 'ذ', 'ر', 'ز', 'ژ', 'ص', 'ض', 'ط', 'ظ', 'ع', 'غ', 'ف', 'ق', 'ک', 'گ', 'ل', 'م', 'ن', 'و', 'ه', 'ی'];



const brands = [
{
    id: 1,
    brand_name: 'adidas',
    brand_trans: 'أديداس',
    isPremium: true,
    url: '/brands/adidas'
},
{
    id: 2,
    brand_name: 'adidas Originals',
    brand_trans: 'أديداس اوريجينال',
    isPremium: false,
    url: '/brands/adidas-originals'
},
{
    id: 4,
    brand_name: 'Bodyism',
    brand_trans: 'بودييزم',
    isPremium: false,
    url: '/brands/bodyism'
},
{
    id: 5,
    brand_name: 'Columbia',
    brand_trans: 'كولومبيا',
    isPremium: false,
    url: '/brands/columbia'
},
{
    id: 5,
    brand_name: 'Converse',
    brand_trans: 'كونفرس',
    isPremium: true,
    url: '/brands/converse'
},
];

输出应该是这样的

            {
            brand_group_title: 'ا',
            brand_list: [
                {
                    id: 1,
                    brand_name: 'adidas',
                    brand_trans: 'أديداس',
                    isPremium: true,
                    url: '/brands/adidas'
                },
                {
                    id: 2,
                    brand_name: 'adidas Originals',
                    brand_trans: 'أديداس اوريجينال',
                    isPremium: false,
                    url: '/brands/adidas-originals'
                },
            ]
        } {
            brand_group_title: 'ب',
            brand_list: [
                {
                    id: 4,
                    brand_name: 'Bodyism',
                    brand_trans: 'بودييزم',
                    isPremium: false,
                    url: '/brands/bodyism'
                },
          ]
        } {
            brand_group_title: 'ك',
            brand_list: [
                {
                    id: 5,
                    brand_name: 'Columbia',
                    brand_trans: 'كولومبيا',
                    isPremium: false,
                    url: '/brands/columbia'
                },
                {
                    id: 5,
                    brand_name: 'Converse',
                    brand_trans: 'كونفرس',
                    isPremium: true,
                    url: '/brands/converse'
                },
          ]
        }

我的解决方案

我使用过ES2015辅助功能,解决方法是打印列表但不是根据阿拉伯字母

var printList_ar = ar_alpha.map(function (ch) {
var matchedItems = brands.filter(function (obj) {
    return obj.brand_trans.startsWith(ch)
})
if (matchedItems.length > 0)
    return {
        brand_group_title: ch,
        brand_list: matchedItems
    };
  }).filter(function (res) {
       return res != undefined
   });

 printList_ar;

1 个答案:

答案 0 :(得分:1)

使用地图将对象与字母链接。

const keys = ['ا', 'ب', 'پ', 'ت', 'ث', 'ج', 'چ', 'ح', 'خ', 'د', 'ذ', 'ر', 'ز', 'ژ', 'ص', 'ض', 'ط', 'ظ', 'ع', 'غ', 'ف', 'ق', 'ک', 'گ', 'ل', 'م', 'ن', 'و', 'ه', 'ی'];
const data = [{
    id: 1,
    brand_name: 'adidas',
    brand_trans: 'أديداس',
    isPremium: true,
    url: '/brands/adidas'
  },
  {
    id: 2,
    brand_name: 'adidas Originals',
    brand_trans: 'أديداس اوريجينال',
    isPremium: false,
    url: '/brands/adidas-originals'
  },
  {
    id: 4,
    brand_name: 'Bodyism',
    brand_trans: 'بودييزم',
    isPremium: false,
    url: '/brands/bodyism'
  },
  {
    id: 5,
    brand_name: 'Columbia',
    brand_trans: 'كولومبيا',
    isPremium: false,
    url: '/brands/columbia'
  },
  {
    id: 5,
    brand_name: 'Converse',
    brand_trans: 'كونفرس',
    isPremium: true,
    url: '/brands/converse'
  },
];
var hash = new Map()
for (var i of data) {
  var l = i.brand_trans[0];
  var val = hash.get(l);
  if (val) {
    val.push(i)
  } else {
    hash.set(l, [i])
  }
}
var result = Array.from(hash, (x, y) => {
  return {
    brand_group_title: x[0],
    'brand_list': x[1]
  }
})
console.log(...result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

这里是O(n)

const keys = ['ا', 'ب', 'پ', 'ت', 'ث', 'ج', 'چ', 'ح', 'خ', 'د', 'ذ', 'ر', 'ز', 'ژ', 'ص', 'ض', 'ط', 'ظ', 'ع', 'غ', 'ف', 'ق', 'ک', 'گ', 'ل', 'م', 'ن', 'و', 'ه', 'ی'], data = [{
    id: 1,
    brand_name: 'adidas',
    brand_trans: 'أديداس',
    isPremium: true,
    url: '/brands/adidas'
  },
  {
    id: 2,
    brand_name: 'adidas Originals',
    brand_trans: 'أديداس اوريجينال',
    isPremium: false,
    url: '/brands/adidas-originals'
  },
  {
    id: 4,
    brand_name: 'Bodyism',
    brand_trans: 'بودييزم',
    isPremium: false,
    url: '/brands/bodyism'
  },
  {
    id: 5,
    brand_name: 'Columbia',
    brand_trans: 'كولومبيا',
    isPremium: false,
    url: '/brands/columbia'
  },
  {
    id: 5,
    brand_name: 'Converse',
    brand_trans: 'كونفرس',
    isPremium: true,
    url: '/brands/converse'
  },
];

var result = Array.from(
  data.reduce((acc, o) => acc.has([o.brand_trans[0]]) ? acc.get([o.brand_trans[0]]).push(o) : acc.set([o.brand_trans[0]], [o]), new Map),
  (([k, v]) => ({
    brand_group_title: k,
    brand_list: v
  }))
);


console.log(...result);