如果在数组中发现重复,则必须通过纯javascript添加带有键的索引

时间:2016-04-18 07:20:01

标签: javascript arrays json

我在数组中有一组项目。每个项目都有多个对象。

如果我们发现基于特定对象的重复项目,则必须使用该关键对象添加索引

代表:

var values = [
    { name: 'someName' },
    { name: 'someName' },
    { name: 'some' },
    { name: 'some' },
    { name: 'single' }
]; 

它将成为

var values = [
        { name: 'someName' },
        { name: 'someName1' },
        { name: 'some' },
        { name: 'some1' },
        { name: 'single' }
    ];

我如何在纯javascript(无jQuery)中为此编写逻辑

https://jsfiddle.net/MohaideenIsmail/kr88up0m/1/

2 个答案:

答案 0 :(得分:1)

thisArgs Array#forEach()作为保留计数的临时对象的解决方案。



var values = [{ name: 'someName' }, { name: 'someName' }, { name: 'some' }, { name: 'some' }, { name: 'single' }];

values.forEach(function (a) {
    if (!this[a.name]) {
        this[a.name] = { count: 0 };
        return;
    }
    a.name += ++this[a.name].count;
}, Object.create(null));

document.write('<pre>' + JSON.stringify(values, 0, 4) + '</pre>');
&#13;
&#13;
&#13;

答案 1 :(得分:0)

问题和示例不是很内联。

  

如果我们发现基于特定对象的重复项目,则必须使用该关键对象添加索引

从上面的句子中我理解的是,如果我们发现重复,则应执行以下任一操作。由于它还不清楚如果存在多个重复项会发生什么,代码将处理所有现有的重复项。

1。第一个索引值将添加到重复对象的名称属性值中。

&#13;
&#13;
var values = [
              { name: 'someName' },
              { name: 'someName' },
              { name: 'some'     },
              { name: 'some'     },
              { name: 'single'   },
              { name: 'someName' },
              { name: 'some'     }
             ],
     redIx = values.reduce((p,c,i) => { !!p[c.name] ? p[c.name].push(i) : (p[c.name] = [], p[c.name].push(i))
                                        return p
                                      },{});console.log(redIx)
Object.keys(redIx).forEach( e => redIx[e].forEach((i,j) => j>0 && (values[i].name += redIx[e][0])));
document.write('<pre>' + JSON.stringify(values, 0, 2) + '</pre>');
&#13;
&#13;
&#13;

2。重复的索引值将添加到其名称属性值中。

&#13;
&#13;
var values = [
              { name: 'someName' },
              { name: 'someName' },
              { name: 'some'     },
              { name: 'some'     },
              { name: 'single'   },
              { name: 'someName' },
              { name: 'some'     }
             ],
      redIx = values.reduce((p,c,i) => { !!p[c.name] ? p[c.name].push(i) : p[c.name] = [];
                                         return p
                                       },{});
Object.keys(redIx).forEach( e => redIx[e].forEach(i => values[i].name += i));
document.write('<pre>' + JSON.stringify(values, 0, 2) + '</pre>');
&#13;
&#13;
&#13;

3。&#34; 1&#34;字符将被添加到重复对象的名称属性值,如示例中所示。

&#13;
&#13;
var values = [
    	      { name: 'someName' },
              { name: 'someName' },
              { name: 'some'     },
              { name: 'some'     },
              { name: 'single'   },
              { name: 'someName' },
              { name: 'some'     }
             ],
     redIx = values.reduce((p,c,i) => { !!p[c.name] ? p[c.name].push(i) : p[c.name] = [];
                                        return p
                                      },{});
Object.keys(redIx).forEach( e => redIx[e].forEach(i => values[i].name += "1"));
document.write('<pre>' + JSON.stringify(values, 0, 2) + '</pre>');
&#13;
&#13;
&#13;