为了账号安全,请及时绑定邮箱和手机立即绑定

过滤数组内的元数据

过滤数组内的元数据

跃然一笑 2022-05-26 11:20:24
在下面的小提琴中,我无法弄清楚如何过滤元数据。需要减少元数据,使其看起来像下面显示的最终 JSON。最终的 JSON 对象应如下所示(JSON 对象是两家公司,因为 Ford 不在 fav 数组中,并且本田和丰田的元数据减少了)。我怎样才能实现这个https://jsfiddle.net/netchi/rb2oLq1w/25/ 如果需要,我愿意重新安排元数据数组的定义方式。  {    text: "Toyota",    origin: "Japan",    icon: "icon",    metaData: [      {        text: "Sedans",        models: "4"      }    ]  },   {    text: "Honda",    models: "8",    icon: "icon",    metaData: [      {        text: "Suvs",        models: "4"      }    ]  }
查看完整描述

2 回答

?
米琪卡哇伊

TA贡献1998条经验 获得超6个赞

您有 2 个解决方案。一个假设,所有元数据都将具有匹配的子菜单。其他假设,可能存在没有子菜单匹配的情况。然后排除该公司。


var fav = ["Toyota", "Honda"];

var ToyotaMetadata = ["Sedans"];

var HondaMetadata = ["Suvs"];

const favMap = {

    Toyota: ["Sedans"],

    Honda: ["Suvs"]

};

var companies = [

    {

        text: "Toyota",

        origin: "Japan",

        icon: "icon",

        metaData: [

            {

                text: "Suvs",

                models: "4"

            },

            {

                text: "Sedans",

                models: "4"

            }

        ]

    },


    {

        text: "Ford",

        founder: "Henry Ford",

        icon: "icon"

    },


    {

        text: "Honda",

        models: "8",

        icon: "icon",

        metaData: [

            {

                text: "Suvs",

                models: "4"

            },

            {

                text: "Sedans",

                models: "4"

            }

        ]

    }

];

const merge = function () {

    var args = Array.prototype.slice.call(arguments);

    return Object.assign.apply({}, args)

}

// Simple

const res2 = companies.reduce((map, comp) => {

    if (favMap[comp.text]) {

        map.push(merge(comp, { metaData: comp.metaData.filter(x => favMap[comp.text].indexOf(x.text) != -1) }));

    }

    return map;

}, []);

console.log(JSON.stringify(res2, null, 4));


// Above will fail. if company is without metadata of car model, still match fav

/*

{

    text: "Toyota",

    origin: "Japan",

    icon: "icon",

    metaData: [

    ]

  },

*/


// Complex

const res = companies.reduce((map, comp) => {

    let index = 0;

    if (

        favMap[comp.text] &&

        comp.metaData.some(x => {

            index++;

            if (favMap[comp.text].indexOf(x.text) != -1) {

                return true;

            }

        })

    ) {

        map.push(merge(comp, { metaData: [comp.metaData[index - 1]] }));

    }

    return map;

}, []);

console.log(JSON.stringify(res, null, 4));


查看完整回答
反对 回复 2022-05-26
?
慕斯王

TA贡献1864条经验 获得超2个赞

您可以将您的设置定义为一个对象,并.map()用于外部数组和.filter()内部数组:


let metadataConf = { "Toyota": ToyotaMetadata, "Honda": HondaMetadata };


let result = companies.filter(x => x.metaData).map(({metaData, text, ...fields}) => ({ 

     ...fields, text, metaData: metaData.filter(x => metadataConf[text].includes(x.text)) 

}));

var fav = ["Toyota", "Honda"];

var ToyotaMetadata = ["Sedans"];

var HondaMetadata = ["Suvs"]


var companies = [

  {

    text: "Toyota",

    origin: "Japan",

    icon: "icon",

    metaData: [

      {

        text: "Suvs",

        models: "4"

      },

      {

        text: "Sedans",

        models: "4"

      }

    ]

  },


  {

    text: "Ford",

    founder: "Henry Ford",

    icon: "icon"

  },

  

  {

    text: "Honda",

    models: "8",

    icon: "icon",

    metaData: [

      {

        text: "Suvs",

        models: "4"

      },

      {

        text: "Sedans",

        models: "4"

      }

    ]

  }

];


let metadataConf = { "Toyota": ToyotaMetadata, "Honda": HondaMetadata };


let result = companies.filter(x => x.metaData).map(({metaData, text, ...rest}) => ({ ...rest, text, metaData: metaData.filter(x => metadataConf[text].includes(x.text)) 

}));


console.log(result);


查看完整回答
反对 回复 2022-05-26
  • 2 回答
  • 0 关注
  • 204 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号