Javascript 将随机序列分组到对象数组中
我有一个文本文件,包含两种不同类型的数据:“名称”和“操作”,每种类型在整个文本文件中以随机顺序重复:Javascript 将随机序列分组到对象数组中,javascript,Javascript,我有一个文本文件,包含两种不同类型的数据:“名称”和“操作”,每种类型在整个文本文件中以随机顺序重复: NAME: joe ACTION: running NAME: paul ACTION: walking ACTION: swimming NAME: mary NAME: joe ACTION: sleeping NAME: paul NAME: mary NAME: ken ACTION: jumping ACTION: running ACTION: eatin
NAME: joe
ACTION: running
NAME: paul
ACTION: walking
ACTION: swimming
NAME: mary
NAME: joe
ACTION: sleeping
NAME: paul
NAME: mary
NAME: ken
ACTION: jumping
ACTION: running
ACTION: eating
我试图创建一个对象数组,通过连接每种类型的数据,使每个对象只包含一对名称和操作,如下所示:
{
“name”: joe,
“action” : running
}
{
“name: paul,
“action” : walking swimming
}
{
“name: mary joe,
“action” : sleeping
}
{
“name: paul mary ken,
“action” : jumping running eating
}
到目前为止,我已经尝试使用一个简单的for循环逐行遍历文本文件,检查一行是否包含名称或操作,但我无法找出连接并将值推入数组的逻辑而不会遇到麻烦。我正在学习javascript,真的需要一些帮助来解决这个问题,提前谢谢。您需要先将文本字符串逐行拆分,然后在每行上循环并解析键和值。这里有一个有效的例子
var text=`NAME:joe
行动:跑步
姓名:保罗
行动:步行
动作:游泳
姓名:玛丽
姓名:乔
行动:睡觉
姓名:保罗
姓名:玛丽
姓名:肯
动作:跳跃
行动:跑步
行动:进食`
//将文本拆分为一行数组
变量行=文本。拆分(“\n”)
var data=[]//最终映射的数据
var person=null//要向其添加操作的person对象
//每行循环一次
行。forEach(函数(行){
//将行拆分为键(名称或操作)和值
var vals=line.split(“:”)
var键=VAL[0]
var val=val[1]
//如果这一行是一个新的名字,请创建一个新的“人”
如果(键=='NAME'){
//将当前人员保存到最终数据
if(个人)数据推送(个人)
//然后创建一个新的
person={name:val,操作:“”
//将操作添加到当前人员(如果有)
}否则,如果(人){
person.actions+=val
}
})
console.log(数据)
这里有一个类似于Kevin的解决方案。最大的区别在于它创建新对象并将它们添加到数组时,而不是仅附加到现有值时。希望有帮助
var lines = `NAME: joe
ACTION: running
NAME: paul
ACTION: walking
ACTION: swimming
NAME: mary
NAME: joe
ACTION: sleeping
NAME: paul
NAME: mary
NAME: ken
ACTION: jumping
ACTION: running
ACTION: eating`
var entries = [];
var current = null;
lines.split("\n").forEach(function(entry) {
if (entry.indexOf('NAME:') > -1) {
var name = entry.substring(6);
// if the current instance hasn't been set yet,
// or there is already a value present, start a new object.
if (!current || current.action) {
current = { name: name, action: null };
entries.push(current);
return;
}
// append the new name the current name list
current.name = `${current.name} ${name}`;
return;
}
// append the new action to the current action list.
// if action is null, just set the action as its initial value.
var action = entry.substring(8);
current.action = !current.action ? action : `${current.action} ${action}`;
});
console.log(entries);
您可以使用.match()
RegExp
/NAME.+(?=\s\n)/g
和/ACTION.+(?=\s\n)/g
匹配以“NAME”
和“ACTION”
,.map()
和开头的行。用RegExp替换()
,替换
、:“
和空格字符
使用Math.max()
获取最大数组.length
,将设置为循环的最大迭代次数.push()
将新对象放入数组;如果在.length
较小的数组的索引中不存在元素,请将空字符串“
设置为属性值
var text=`NAME:joe
行动:跑步
姓名:保罗
行动:步行
动作:游泳
姓名:玛丽
姓名:乔
行动:睡觉
姓名:保罗
姓名:玛丽
姓名:肯
动作:跳跃
行动:跑步
动作:吃`;
var[res,…[name,actions]=[]
,text.match(/NAME.+(?=\s\n)/g)
,text.match(/ACTION.+(?=\s\n)/g)
].map(功能(arr){
返回arr.map(函数(值){
返回值。替换(/^[A-Z:\s]+/,“”)
})
});
for(var i=0;i 控制台日志(res)代码>在文本文件上循环,并假设您始终有一个名称行。如果为true,则可以在名为name的变量中压缩字符串。如果不是,则创建另一个存储操作的变量,创建一个新对象,插入对象名称和操作变量,将此对象推送到数组中,并将名称变量还原为空。希望它能有所帮助:在该算法中,在找到一个动作行之后,你必须假设下一个动作仍然是一个动作,并将其存储在一个变量中。如果它不是一个动作,你必须将一个新对象推到数组中,并重新初始化用于存储名称和动作的变量。我刚刚注意到这与你想要的输出不太匹配,但也许你可以从这里找到它。顺便说一句,`around${current.name}${name}
,它们的作用或含义是什么?起初我试着用普通的引号输入,但没有用…@JensB它被称为“模板文字”。ES6中许多伟大的新特性之一。这里有更多的细节