如何将连续的索引号添加到数组中的唯一值

这是我有的一个数组:


var arr1 = [

    { ModuleID : 'one', ModuleValue : 'valueX'},

    { ModuleID : 'one', ModuleValue : 'valueV'},

    { ModuleID : 'one', ModuleValue : 'valueE'},

    { ModuleID : 'one', ModuleValue : 'valueY'},

    { ModuleID : 'two', ModuleValue : 'valueZ'},

    { ModuleID : 'two', ModuleValue : 'valueB'},

    { ModuleID : 'two', ModuleValue : 'valueA'}

];

我想根据 ModuleID 将连续的“索引”号添加到我的数组中,如下所示:


var arr2 = [

    { ModuleID : 'one', ModuleValue : 'valueX', index : 0},

    { ModuleID : 'one', ModuleValue : 'valueV', index : 1},

    { ModuleID : 'one', ModuleValue : 'valueE', index : 2},

    { ModuleID : 'one', ModuleValue : 'valueY', index : 3},

    { ModuleID : 'two', ModuleValue : 'valueZ', index : 0},

    { ModuleID : 'two', ModuleValue : 'valueB', index : 1},

    { ModuleID : 'two', ModuleValue : 'valueA', index : 2}

];

到目前为止,我已经想出了这段代码:


var arr2 = [];

var index = 0;



for (var i = 0; i < arr1.length; ++i) {

        if (i < arr1.length && arr1[i].ModuleID = arr1[i+1].ModuleID ) {

            index = index + 1;

        } else {

            index = 0;

        };

    arr2.push({ModuleID: arr1[i].ModuleID, ModuleValue: arr1[i].ModuleValue, index: index});

};

但是,它会重置 ModuleID 最后一个值的连续数字,而不是第一个值:


var arr2 = [

    { ModuleID : 'one', ModuleValue : 'valueX', index : 1},

    { ModuleID : 'one', ModuleValue : 'valueV', index : 2},

    { ModuleID : 'one', ModuleValue : 'valueE', index : 3},

    { ModuleID : 'one', ModuleValue : 'valueY', index : 0},

    { ModuleID : 'two', ModuleValue : 'valueZ', index : 1},

    { ModuleID : 'two', ModuleValue : 'valueB', index : 2},

    { ModuleID : 'two', ModuleValue : 'valueA', index : 3}

];

我该如何改进我的代码?


DIEA
浏览 46回答 5
5回答

幕布斯7119047

let idx = 0;arr.map((item, i) => {&nbsp; &nbsp; if(i == 0 || arr[i].ModuleID != arr[i-1].ModuleID)&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; idx = 0;&nbsp; &nbsp; else&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; idx++;&nbsp; item['index'] = idx;&nbsp;});

心有法竹

您可以采用哈希表作为分组索引。var array = [{ ModuleID: 'one', ModuleValue: 'valueX' }, { ModuleID: 'one', ModuleValue: 'valueV' }, { ModuleID: 'one', ModuleValue: 'valueE' }, { ModuleID: 'one', ModuleValue: 'valueY' }, { ModuleID: 'two', ModuleValue: 'valueZ' }, { ModuleID: 'two', ModuleValue: 'valueB' }, { ModuleID: 'two', ModuleValue: 'valueA' }],&nbsp; &nbsp; result = array.map(&nbsp; &nbsp; &nbsp; &nbsp; (c => o => ({ ...o, index: (c[o.ModuleID] ??= 0, c[o.ModuleID]++) }))&nbsp; &nbsp; &nbsp; &nbsp; ({})&nbsp; &nbsp; );console.log(result);

Smart猫小萌

只需循环遍历数组并检查 的值,ModuleID并根据该值添加一个index属性,该属性的值是两个可能的计数器之一的值,然后递增。if/then 逻辑可以做得更紧凑,但我在这里使用的是以防稍后添加也需要检查的switch其他值。ModuleIDvar arr1 = [&nbsp; &nbsp; { ModuleID : 'one', ModuleValue : 'valueX'},&nbsp; &nbsp; { ModuleID : 'one', ModuleValue : 'valueV'},&nbsp; &nbsp; { ModuleID : 'one', ModuleValue : 'valueE'},&nbsp; &nbsp; { ModuleID : 'one', ModuleValue : 'valueY'},&nbsp; &nbsp; { ModuleID : 'two', ModuleValue : 'valueZ'},&nbsp; &nbsp; { ModuleID : 'two', ModuleValue : 'valueB'},&nbsp; &nbsp; { ModuleID : 'two', ModuleValue : 'valueA'}];let a = 0;let b = 0;arr1.forEach(function(obj){&nbsp; switch (obj.ModuleID) {&nbsp; &nbsp; case "one":&nbsp; &nbsp; &nbsp; obj.index = a++;&nbsp; &nbsp; &nbsp; break;&nbsp; &nbsp; case "two":&nbsp; &nbsp; &nbsp; obj.index = b++;&nbsp; &nbsp; &nbsp; break;&nbsp; }});console.log(arr1);

一只斗牛犬

var arr2 = [];var index = 0;&nbsp;var transition = false;for (var i = 0; i < arr1.length; ++i) {&nbsp; &nbsp; if (i < arr1.length && arr1[i].ModuleID = arr1[i+1].ModuleID ) {&nbsp; &nbsp; &nbsp; &nbsp; index = index + 1;&nbsp; &nbsp; } else {&nbsp; &nbsp; &nbsp; &nbsp; transition = true;index = index + 1;&nbsp; &nbsp; };arr2.push({ModuleID: arr1[i].ModuleID, ModuleValue: arr1[i].ModuleValue, index: index});&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if(transition){&nbsp;&nbsp;index=0;transition = false;}};&nbsp;

慕田峪4524236

那是你想做的吗?var arr1 = [&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{ModuleID: 'one', ModuleValue: 'valueX'},&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{ModuleID: 'one', ModuleValue: 'valueV'},&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{ModuleID: 'one', ModuleValue: 'valueE'},&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{ModuleID: 'one', ModuleValue: 'valueY'},&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{ModuleID: 'two', ModuleValue: 'valueZ'},&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{ModuleID: 'two', ModuleValue: 'valueB'},&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{ModuleID: 'two', ModuleValue: 'valueA'}&nbsp; &nbsp; ];&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; function setIndex (item, idx) {&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;arr1 [idx] .index = idx + 1&nbsp; &nbsp; }&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; arr1.forEach (setIndex)&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; console.log ("code changed")&nbsp; &nbsp; console.log (arr1)这是生成的结果[&nbsp; {&nbsp; &nbsp; "ModuleID": "one",&nbsp; &nbsp; "ModuleValue": "valueX",&nbsp; &nbsp; "index": 1&nbsp; },&nbsp; {&nbsp; &nbsp; "ModuleID": "one",&nbsp; &nbsp; "ModuleValue": "valueV",&nbsp; &nbsp; "index": 2&nbsp; },&nbsp; {&nbsp; &nbsp; "ModuleID": "one",&nbsp; &nbsp; "ModuleValue": "valueE",&nbsp; &nbsp; "index": 3&nbsp; },&nbsp; {&nbsp; &nbsp; "ModuleID": "one",&nbsp; &nbsp; "ModuleValue": "valueY",&nbsp; &nbsp; "index": 4&nbsp; },&nbsp; {&nbsp; &nbsp; "ModuleID": "two",&nbsp; &nbsp; "ModuleValue": "valueZ",&nbsp; &nbsp; "index": 5&nbsp; },&nbsp; {&nbsp; &nbsp; "ModuleID": "two",&nbsp; &nbsp; "ModuleValue": "valueB",&nbsp; &nbsp; "index": 6&nbsp; },&nbsp; {&nbsp; &nbsp; "ModuleID": "two",&nbsp; &nbsp; "ModuleValue": "valueA",&nbsp; &nbsp; "index": 7&nbsp; }]
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript