繁体   English   中英

从数组内对象的字段中提取所有单词

[英]Extract all words from fields of objects inside array

我有这个数组:

array = [{"full_name":"louis jackson","title1":"english teacher,"description":"good and nice teacher"},{"full_name":"peter carey","title1":"math teacher,"description":"bad and ugly teacher"}]

我需要得到这个数组

results = ["louis","jackson","english", "teacher",good","and","nice","teacher","peter","carey","math","teacher","bad","and","ugly","teacher"]

我试过了:

results = [];
array.forEach(item => {
results.push (item.full_name.split(" "));
results.push (item.title1.split(" "));
results.push (item.description.split(" "));    
}

我只是得到多个分离的数组; 谁能以正确的方式指导我?

我做了一些干净的代码来为你做这一切

 array = [{"full_name":"louis jackson","title1":"english teacher","description":"good and nice teacher"},{"full_name":"peter carey","title1":"math teacher","description":"bad and ugly teacher"}] var results = array.flatMap(obj => { const vals = Object.values(obj); return vals.flatMap(val => val.split(' ')); }) console.log(results);

Object.values只是从每个对象的每个属性中获取值,因此您无需处理诸如“full_name”或“title1”之类的键

然后一旦你有了这些值,你就用空格分割它们并将它们作为数组返回。

flatMap确保如果您返回一个数组数组,它​​会将其展平 1 层。

编辑 - 这是一个单班轮:

var results = array.flatMap(obj => Object.values(obj).flatMap(val => val.split(' ')));

假设值始终是字符串,并且单词可能由多个空格分隔:

这个v.split(/ +/)将每个短语拆分为一个字符串数组,这些字符串将连接到主数组( reduce函数中的累加器)。

 let array = [{"full_name":"louis jackson","title1":"english teacher","description":"good and nice teacher"},{"full_name":"peter carey","title1":"math teacher","description":"bad and ugly teacher"}]; let result = array.reduce((a, c) => { Object.values(c).forEach(v => a = a.concat(v.split(/ +/))); return a; }, []); console.log(result);
 .as-console-wrapper { max-height: 100% !important; top: 0; }

您的解决方案是接近的,但你必须concat ,而不是推分割阵列到阵列results 像这样:

 let array = [{"full_name":"louis jackson","title1":"english teacher","description":"good and nice teacher"},{"full_name":"peter carey","title1":"math teacher","description":"bad and ugly teacher"}] let results = []; array.forEach(item => { results = results.concat(item.full_name.split(" ")) .concat(item.title1.split(" ")) .concat(item.description.split(" ")); }); console.log(results);

这是使用for..offor..in的另一种方法,因此您无需手动定义属性名称:

 let array = [{"full_name":"louis jackson","title1":"english teacher","description":"good and nice teacher"},{"full_name":"peter carey","title1":"math teacher","description":"bad and ugly teacher"}] let results = []; for(const item of array) for(const prop in item) results.push(...item[prop].split(" ")) console.log(results);

结果是一个空数组。 split()方法返回一个数组。 当您在数组上调用push()时,您是在向数组中添加一个数组。 每次调用 push 时,都会向数组中添加另一个数组。 所以你有一个数组数组。 您想要的是包含所有值的单个数组。

因此,对每个值调用split()以获取数组,遍历这些值,然后对数组的值而不是数组本身调用push()

尝试这个

var results = [];
array.forEach(item => {
   var names = item.full_name.split(" ");
   names.forEach(i => result.push(i));

   var titles = item.title1.split(" ");
   titles.forEach(t => result.push(t));

}

您可以接受@Klaycon 的建议并使用

.concat()而不是forEach循环。 如果您使用的不是旧版本的 IE,您可以使用... a ssign operator

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM