Javascript JS在对象数组中查找匹配项,如果其值为0,则将其删除,否则将其移动到数组末尾

Javascript JS在对象数组中查找匹配项,如果其值为0,则将其删除,否则将其移动到数组末尾,javascript,jquery,Javascript,Jquery,数据集: var labels = ["Caterer", "INDEED", "Sarova Website", "Send to Friend", "alexandre-creed.com", "amdas.co.uk", "catabaseuk.co.uk", "cerecruit.co.uk", "el8recruitment.com", "equinoxresourcing.co.uk", "gatewayjobs.co.uk", "hotelstaffpec.co.uk", "jw

数据集:

 var labels = ["Caterer", "INDEED", "Sarova Website", "Send to Friend", "alexandre-creed.com", "amdas.co.uk", "catabaseuk.co.uk", "cerecruit.co.uk", "el8recruitment.com", "equinoxresourcing.co.uk", "gatewayjobs.co.uk", "hotelstaffpec.co.uk", "jwrecruitment.co.uk", "marshallhr.co.uk", "marshallhr.com (Sarova)", "momentumrecruitment.com", "peoplebank.com", "ph-recruitment.co.uk", "platinum-hospitality.co.uk", "q", "talenthive.co.uk", "towngate-personnel.co.uk"];

var dataSet = {
  "ADVERTS_PUBLISHED": ["102", "130", "153", "2", "2", "2", "2", "4", "2", "5", "2", "4", "3", "8", "4", "4", "4", "1", "3", "4", "1", "2"],
  "VIEWS": ["1642", "10566", "45269", "7", "4", "1", "11", "9", "11", "12", "5", "0", "14", "6", "3", "13", "19", "2", "8", "3", "2", "2"],
  "CLICKS": ["1992", "3628", "4458", "4", "2", "2", "7", "3", "11", "5", "6", "9", "10", "15", "10", "4", "34", "10", "10", "3", "0", "8"],
  "SUBMITTED": ["1101", "877", "1290", "2", "3", "2", "10", "14", "11", "5", "5", "7", "6", "14", "8", "6", "17", "7", "9", "4", "1", "6"],
  "PENDING": ["115", "26", "93", "0", "1", "0", "7", "3", "6", "2", "0", "0", "4", "8", "0", "3", "0", "0", "1", "0", "1", "0"],
  "FILTERED": ["546", "493", "764", "1", "2", "2", "9", "12", "10", "5", "4", "5", "5", "12", "2", "3", "4", "6", "4", "0", "1", "5"],
  "SHORTLISTED": ["37", "23", "32", "1", "0", "0", "0", "1", "0", "2", "0", "1", "0", "5", "0", "0", "0", "0", "2", "0", "0", "1"],
  "REGRETTED": ["103", "28", "52", "0", "1", "0", "1", "6", "5", "3", "0", "2", "1", "1", "0", "0", "1", "3", "1", "0", "0", "2"],
  "INTERVIEWED": ["62", "45", "88", "0", "0", "0", "1", "2", "2", "2", "0", "3", "0", "3", "0", "2", "0", "4", "0", "0", "0", "1"],
  "OFFERED": ["4", "10", "20", "0", "0", "0", "0", "0", "0", "0", "0", "3", "0", "2", "0", "0", "0", "0", "0", "0", "0", "0"],
  "OFFERED_AND_DECLINED": ["0", "0", "5", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0"],
  "REGRETTED_AND_COMM": ["587", "334", "533", "0", "0", "2", "1", "1", "2", "1", "0", "1", "2", "4", "0", "1", "0", "0", "0", "2", "0", "0"],
  "ACTUAL_HIRED": ["4", "2", "8", "0", "0", "0", "0", "0", "0", "0", "0", "2", "0", "1", "0", "0", "0", "0", "0", "0", "0", "0"]
};

下面的代码计算一个名为slices的数组,该数组包含具有属性标签和值的对象,所有切片都将包含在图表中。所有低于1%的值都由标记为Others的对象求和并保存

如果Others值为0,我将如何使Others始终成为slices数组中的最后一个元素并将其全部删除

 //create dataset that includes the others grouping
    dataSet2 = [];
    Object.keys(dataSet).forEach(function (item) {
        dataSet2[item] = groupOthers(dataSet[item], 1);
    });

    //groups data points together
    function groupOthers(dataSet, thresholdPercent = 10) {
        const values = dataSet.map(v => Number(v));
        const valueSum = values.reduce((a, b) => a + b, 0);
        const slices = values.map((v, i) => ({ label: labels[i], value: v }))
    .reduce((accumulator, currObj) => {
            const percent = 100 * currObj.value / valueSum;
        if (percent < thresholdPercent) {
            const others = accumulator.find(o => o.label == 'Others');
            if (!others) {
                return accumulator.concat({ label: 'Others', value: currObj.value });
            }
            others.value += currObj.value;
        } else {
            accumulator.push(currObj);
        }
        return accumulator;
    }, []);

        return slices;
    }

输出如下所示

0: {label: "whatever", value: 4}
1: {label: "...", value: 2}
2: {label: "....", value: 1}
3: {label: "....", value: 1}
4: {label: "....", value: 2}
5: {label: "....", value: 1}
6: {label: "....", value: 1}
7: {label: "....", value: 1}
8: {label: "....", value: 1}
9: {label: "Others", value: 2}

我对您的脚本进行了一点修改,以返回您想要的结果:

在返回切片之前,使用特殊的比较函数对数组进行排序:

function(a,b){
  return (a.label=='Others'?1:0)-(b.label=='Others'?1:0);
}
此函数将保持所有元素的顺序,但label==Others的元素除外

以下是工作片段:

变量标签=[餐饮服务商,事实上,Sarova网站,发送至Friend,alexandre-creed.com,amdas.co.uk,catabaseuk.co.uk,cerecruit.co.uk,El8Recruption.com,EquinoxResourceing.co.uk,gatewayjobs.co.uk,hotelstaffpec.co.uk,jwrecruitment.uk,marshallhr.co.uk,marshallhr.com Sarova,MomentumRecruption.com,peoplebank.com,ph-Recruption.co.uk,白金酒店.co.uk,q,talenthive.co.uk,towngate personals.co.uk]; 变量数据集={ 发布的广告:[102130153,2,2,2,2,4,2,5,2,4,3,8,4,4,4,1,3,4,1,2], 视图:[1642、10566、45269、7、4、1、11、9、11、12、5、0、14、6、3、13、19、2、8、3、2、2], 点击:[1992,3628,4458,4,2,2,7,3,11,5,6,9,10,15,10,4,34,10,10,3,0,8], 提交:[11018771290,2,3,2,10,14,11,5,5,7,6,14,8,6,17,7,9,4,1,6], 待定:[115,26,93,0,1,0,7,3,6,2,0,0,4,8,0,3,0,0,0,1,0], 已筛选:[546493764,1,2,2,9,12,10,5,4,5,12,2,3,4,6,4,0,1,5], 入围名单:[37,23,32,1,0,0,0,1,0,2,0,1,0,5,0,0,0,0,0,0,2,0,0,0,1], 遗憾:[103,28,52,0,1,0,1,6,5,3,0,2,1,1,0,0,1,3,1,0,0,0,2], 采访对象:[62,45,88,0,0,0,1,2,2,2,0,3,0,0,2,0,4,0,0,0,0,0,0,1], 报价:[4,10,20,0,0,0,0,0,0,0,0,3,0,2,0,0,0,0,0,0,0,0,0], 提供和拒绝:[0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], _和_COMM:[587、334、533、0、0、2、1、1、2、1、0、1、2、4、0、1、0、0、0、0、2、0、0], 实际雇用人数:[4,2,8,0,0,0,0,0,0,0,0,0,2,0,1,0,0,0,0,0,0,0] }; //创建包含其他分组的数据集 var res=Object.keysdataSet.ReduceFunctions,项{ ds[item]=groupOthersdataSet[item],1;返回ds; }, {} ; console.logres; //将数据点分组在一起 函数组OthersDataSet,阈值百分比=10{ const values=dataSet.mapv=>Numberv; const valueSum=values.reducea,b=>a+b,0; const slices=values.mapv,i=>{label:labels[i],value:v} .reduce累加器,currObj=>{ 常数百分比=100*currObj.value/valueSum; 如果百分比<阈值百分比{ const others=accumulator.findo=>o.label=='others'; 如果!其他{ 返回acculator.concat{label:'Others',value:currObj.value}; } 其他价值+=当前价值; }否则{ 累加器.pushcurrObj; } 回流蓄能器; }, []; //======此处仅发生更改===================开始=== //切片已排序,因此其他切片始终排在最后: 返回片。sortfunctiona,b{ 返回a.label=='Others'?1:0-b.label=='Others'?1:0; }; //=======此处仅发生更改==========================结束=== } 您可以使用Object.entries首先切换到数组格式,进行映射和筛选,然后使用相反的Object.fromEntries返回对象表示:

变量标签=[餐饮服务商,事实上,Sarova网站,发送至Friend,alexandre-creed.com,amdas.co.uk,catabaseuk.co.uk,cerecruit.co.uk,El8Recruption.com,EquinoxResourceing.co.uk,gatewayjobs.co.uk,hotelstaffpec.co.uk,jwrecruitment.uk,marshallhr.co.uk,marshallhr.com Sarova,MomentumRecruption.com,peoplebank.com,ph-Recruption.co.uk,白金酒店.co.uk,q,talenthive.co.uk,towngate personals.co.uk]; var dataSet={Aderts_PUBLISHED:[102、130、153、2、2、4、2、5、2、4、4、4、1、3、4、1、2],视图:[1642、10566、45269、7、4、1、11、9、11、11、11、12、5、0、14、6、3、13、19、2、8、3、2、2、4、2、2、7、3、11、5、6、9、9、10、15、10、4、34、10、10、0、8],点击[1992、3628、4458、4458、4、2、2、2、2、2、2、2、2、2、2、2、7、7、11、11、6、6、6、9、10、10、10、10、8[1101、877、877、1290、2、3、3、3、2、10、14、11、5、7、7、14、8、6、17、7、9、4、4、1、1、6、7、7、7、7、877、8、7、7、8、7、7、7、7、7、7、7、7、8、6、7、7、7、7、9、4、7、7、7、7、7、7、7、7、2、7、3、3、3、3、3、3、3、3、3、3、3、3、3、3、3、3、3、3、3、2、2、2、2、2、2、2、2、2、2、2、2、2、2、10、2、2、2、2、2、2、2、10、2、2、2、2、2、2、2、2、2、2、2、2、2、2、2遗憾的是:[103,28,52,0,1,0,1,6,5,3,0,2,1,1,0,0,1,3,1,0,0,0,2],采访:[62,45,88,0,0,0,0,1,2,2,0,3,0,3, 0,2,0,4,0,0,0,0,1],主动提出:[4,10,20,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],表示遗憾,并表示歉意:[587,334,533,0,0,0,0,2,1,1,2,2,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0[4, 2, 8, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0]}; var阈值=10; var res=Object.fromEntriesObject.entriesdataSet.map[度量,值]=> [度量,值] .filterv=>+v>阈值 .mapv,i=>{label:labels[i],值:+v} .sorta,b=>b.value-a.value 康卡特先生{ 标签:其他,
value:values.reduceAc,v=>acc++v是否可以共享预期的输出?更新的问题是数据集中只有一个键的输出?或者这些键去了哪里?是的,只有一个键的输出
function(a,b){
  return (a.label=='Others'?1:0)-(b.label=='Others'?1:0);
}