我有一个名为 a 的数组,其中包含具有特定字符的单词数。我想通过删除#符号按名称对其进行分类。我想人们可能不清楚我的问题所以我已经在下面给出了这个程序的输出。
我的阵列: -
var a = ['#name1#','#name2#','#name3#','#name1#','#name2#'];
function classify(a){
var t = {};
var y = [];
a.forEach(function(f){
var txt = f.replace('#','').trim();
var txtnode = document.createTextNode(f);
y.push(txtnode);
t[txt] = y;
})
return t;
}
console.log(classify(a))
我想要获得的这个程序的输出: -
{
name1:(2) [text, text]
name2:(2) [text, text]
name3:(1) [text]
}
有关给定输出的更多信息: -
给定的输出可能不准确,因为它是从控制台复制的,但这可能为程序员提供解决此问题的提示 name1 对象属性包含2个数组,其中包含两个具有相同数据类型的文本节点在同一个数组中,第一个textnode中的#name1#和#name1#在另一个属性名称的textnode中,同样在object的 name2 属性中包含#name2#在数组的两个文本节点中,对象的 name3 属性只包含1个带有数据的文本节点#name3
在textnodes中: -
{
name1:[#name1#,#name1#],
name2:[#name2#,#name2#],
name3:[#name3#]
}
请不要使用jquery
答案 0 :(得分:0)
您可以使用Array#reduce从阵列中创建对象。在每次迭代中,通过删除#符号来获取密钥。
如果对象上不存在该键,则将其添加为具有空数组作为值的属性。
将当前项目推送到相关数组。
var a = ['#name1#','#name2#','#name3#','#name1#','#name2#'];
var result = a.reduce(function(r, s) {
var key = s.replace(/#/g, '');
r[key] || (r[key] = []);
r[key].push(s); // document.createTextNode(s) instead of s in your actual code
return r;
}, {});
console.log(result);

答案 1 :(得分:0)
您的问题是您要将所有内容添加到单个数组中,而不是为对象中的每个条目创建不同的数组。
您的代码的另一个问题是f.replace('#', '')
仅替换#
中f
的第一个实例。
这应该具有所需的行为:
function classify(a){
var t = {};
a.forEach(function(f){
var txt = f.replace(/#/g,'').trim();
var txtnode = document.createTextNode(f);
t[txt] = (t[txt] || []).concat(txtnode);
})
return t;
}
var a = ['#name1#','#name2#','#name3#','#name1#','#name2#'];
var classified = classify(a);
console.log(classified.name1.length);
console.log(classified.name2.length);
console.log(classified.name3.length);