次のアプローチをお勧めします(いくつかの点で少し過剰に感じます):
Object.prototype.filterSimilar = function(needle, prop, haystack){
var elems = [],
reg = new RegExp(needle);
for (var i = 0, len = haystack.length; i<len; i++){
if (reg.test(haystack[i].getAttribute(prop))){
elems.push(haystack[i]);
}
}
return elems;
};
Object.prototype.getSimilar = function(prop){
var els = document.getElementsByTagName('*'),
collection = [];
if (this.length){
for (var i = 0, len = this.length; i<len; i++){
collection.push(this[i].filterSimilar(this[i].getAttribute(prop), prop, els));
}
}
else {
collection.push(this.filterSimilar(this.getAttribute(prop), prop, els));
}
return collection[0];
};
var similar1 = document.getElementsByTagName('span').getSimilar('id'),
similar2 = document.getElementById('test').getSimilar('data-name');
console.log(similar1 + '\n' + similar2);
JS フィドルのデモ。
ただし、これは Win 7 の Chrome 25 でのみテストされています。