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中许多伟大的新特性之一。这里有更多的细节