我在数组中有一组项目。每个项目都有多个对象。
如果我们发现基于特定对象的重复项目,则必须使用该关键对象添加索引
代表:
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)中为此编写逻辑
答案 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;
答案 1 :(得分:0)
问题和示例不是很内联。
如果我们发现基于特定对象的重复项目,则必须使用该关键对象添加索引
从上面的句子中我理解的是,如果我们发现重复,则应执行以下任一操作。由于它还不清楚如果存在多个重复项会发生什么,代码将处理所有现有的重复项。
1。第一个索引值将添加到重复对象的名称属性值中。
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;
2。重复的索引值将添加到其名称属性值中。
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;
3。&#34; 1&#34;字符将被添加到重复对象的名称属性值,如示例中所示。
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;