我需要一个可以使用ES6功能减少3个for循环的解决方案。
在下面,我们有两个对象数组,其中我必须在两个位置添加一个密钥对以匹配一个。
let rootContent = [
{
'name' : 'varshan',
'textValues' : [
{ 'id' : 123 , 'value' : 'one' },
{ 'id' : 124 , 'value' : 'two' },
{ 'id' : 125 , 'value' : 'three' },
{ 'id' : 126 , 'value' : 'four' }
]
},
{
'name' : 'kathir',
'textValues' : [
{ 'id' : 223 , 'value' : 'common' },
{ 'id' : 224 , 'value' : 'maddy' },
{ 'id' : 225 , 'value' : 'winner' },
{ 'id' : 226 , 'value' : 'loser' }
]
},
{
'name' : 'karthika',
'textValues' : [
{ 'id' : 323 , 'value' : 'sticker' },
{ 'id' : 324 , 'value' : 'kammal' }
]
},
{
'name' : 'lavanya',
'textValues' : [
{ 'id' : 423 , 'value' : 'beauty' }
]
}
];
let incomingContent = [
{
'name' : 'lavanya',
'text_value' : 'beauty'
},
{
'name' : 'karthika',
'text_value' : 'kammal'
},
{
'name' : 'kathir',
'text_value' : 'maddy'
}
];
第一步是我们必须检查incomingContent
数组中的name字段是否与rootContent
数组中的name字段匹配,如果条件为true,则必须添加一个键值与匹配匹配为真。
此后,我们必须找到textValues
数组的子项,并插入rootContent
数组的text_value字段的incomingContent
数组的独立匹配对象,如果匹配,则添加具有匹配项的键值对为真或假。我在下面附上预期的结果,我需要一个具有map()
,find()
...等ES6功能的解决方案。
for (let i = 0; i < incomingContent.length; i++) {
for (let j = 0; j < rootContent.length; j++) {
if (rootContent[j].name === incomingContent[i].name) {
rootContent[j]['matched'] = true;
for (let k = 0; k < rootContent[j].textValues.length; k++) {
rootContent[j].textValues[k]['matched'] = rootContent[j].textValues[k].value === incomingContent[i].text_value ? true : false;
}
}
}}
输出应仅为这样。
[
{
'name' : 'varshan',
'textValues' : [
{ 'id' : 123 , 'value' : 'one' },
{ 'id' : 124 , 'value' : 'two' },
{ 'id' : 125 , 'value' : 'three' },
{ 'id' : 126 , 'value' : 'four' }
]
},
{
'name' : 'kathir',
'matched' : true,
'textValues' : [
{ 'id' : 223 , 'value' : 'common' , 'matched' : false},
{ 'id' : 224 , 'value' : 'maddy' , 'matched' : true },
{ 'id' : 225 , 'value' : 'winner' , 'matched' : false},
{ 'id' : 226 , 'value' : 'loser' , 'matched' : false}
]
},
{
'name' : 'karthika',
'matched' : true,
'textValues' : [
{ 'id' : 323 , 'value' : 'sticker', 'matched' : false },
{ 'id' : 324 , 'value' : 'kammal' , 'matched' : true }
]
},
{
'name' : 'lavanya',
'matched' : true,
'textValues' : [
{ 'id' : 423 , 'value' : 'beauty' , 'matched' : true }
]
}
]
答案 0 :(得分:0)
将其中一个数组转换为按名称索引的对象,然后您可以在O(1)
时间而不是O(N)
时间中查找关联的名称。使用forEach
而不是for
以避免麻烦手动迭代和索引,并且使用x === y ? true : false
代替x === y
,因为已经解析为布尔值了,所以请使用let rootContent=[{'name':'varshan','textValues':[{'id':123,'value':'one'},{'id':124,'value':'two'},{'id':125,'value':'three'},{'id':126,'value':'four'}]},{'name':'kathir','textValues':[{'id':223,'value':'common'},{'id':224,'value':'maddy'},{'id':225,'value':'winner'},{'id':226,'value':'loser'}]},{'name':'karthika','textValues':[{'id':323,'value':'sticker'},{'id':324,'value':'kammal'}]},{'name':'lavanya','textValues':[{'id':423,'value':'beauty'}]}];let incomingContent=[{'name':'lavanya','text_value':'beauty'},{'name':'karthika','text_value':'kammal'},{'name':'kathir','text_value':'maddy'}]
const rootContentByName = rootContent.reduce((a, item) => {
a[item.name] = item;
return a;
}, {});
incomingContent.forEach(({ name, text_value }) => {
const thisRoot = rootContentByName[name];
thisRoot.matched = true;
thisRoot.textValues.forEach((item) => {
item.matched = item.value === text_value;
});
});
console.log(rootContent);
:< / p>
for
虽然数组方法比chmod o+r /usr/local/lib/python3.5/dist-packages/*
循环要慢 bit ,但是它们通常比 lot 更易读,并且可能更可取,除非您运行过性能测试,并已验证特定方法占用了过多的CPU时间。