[英]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..of
和for..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.