[英]JavaScript: Filter Array of Shoe Objects for Specific Type of Shoes and Return Object Array with Index as Property
I have the following array of shoe objects:我有以下鞋子对象数组:
var currentInventory = [
{
name: 'Brunello Cucinelli',
shoes: [
{name: 'tasselled black low-top lace-up', price: 1000},
{name: 'tasselled green low-top lace-up', price: 1100},
{name: 'plain beige suede moccasin', price: 950},
{name: 'plain olive suede moccasin', price: 1050}
]
},
{
name: 'Gucci',
shoes: [
{name: 'red leather laced sneakers', price: 800},
{name: 'black leather laced sneakers', price: 900}
]
}
];
Using the currentInventory array above, I want to find all the laced shoes and indicate which word contains lace:使用上面的 currentInventory 数组,我想找到所有系鞋带并指出哪个词包含蕾丝:
Desired output below:所需的输出如下:
[
{
"nameWords": [
"tasselled",
"black",
"low-top",
"lace-up"
],
"targetWordIndex": 3
},
{
"nameWords": [
"tasselled",
"green",
"low-top",
"lace-up"
],
"targetWordIndex": 3
},
{
"nameWords": [
"red",
"leather",
"laced",
"sneakers"
],
"targetWordIndex": 2
},
{
"nameWords": [
"black",
"leather",
"laced",
"sneakers"
],
"targetWordIndex": 2
}
]
Below is my attempted code;以下是我尝试的代码; it comes close but not quite there:它接近但不完全在那里:
function renderLacedShoes(inventory) {
//console.log(inventory)
let finalArr = [];
for (let i=0; i<inventory.length; i++){
let indObj = inventory[i];
let newObj = {};
// dive into values associated with shoes
for (let k=0; k<indObj.shoes.length; k++){
let shoeNameArr = indObj.shoes[k].name.split(" ");
//console.log(shoeNameArr)
if ( (shoeNameArr.includes('lace-up')) || (shoeNameArr.includes('laced')) ){
newObj['nameWords'] = shoeNameArr;
console.log(newObj)
// not working below
newObj['targetWordIndex'] = (shoeNameArr.indexOf('lace-up' || 'laced'))
}
}
finalArr.push(newObj);
}
return finalArr;
}
// TEST:
renderLacedShoes(currentInventory)
My code outputs:我的代码输出:
[ { nameWords: [ 'tasselled', 'green', 'low-top', 'lace-up' ],
targetWordIndex: 3 },
{ nameWords: [ 'black', 'leather', 'laced', 'sneakers' ],
targetWordIndex: -1 } ]
I see two issues: It's not returning ALL the "lace" containing shoes.我看到两个问题:它没有返回所有包含鞋子的“花边”。 Also, my targetWordIndex is off.另外,我的 targetWordIndex 已关闭。
What am I doing wrong?我究竟做错了什么?
You have not only a problem with the index, but also with the pushing the result.您不仅有索引问题,而且推送结果也有问题。 This should take place inside of the inner loop.这应该发生在内部循环内部。
function renderLacedShoes(inventory) { let finalArr = []; for (let i = 0; i < inventory.length; i++) { let indObj = inventory[i]; for (let k = 0; k < indObj.shoes.length; k++) { let nameWords = indObj.shoes[k].name.split(" "); let targetWordIndex = nameWords.findIndex(s => s === 'lace-up' || s === 'laced'); if (targetWordIndex !== -1) { finalArr.push({ nameWords, targetWordIndex }); } } } return finalArr; } var currentInventory = [{ name: 'Brunello Cucinelli', shoes: [{ name: 'tasselled black low-top lace-up', price: 1000 }, { name: 'tasselled green low-top lace-up', price: 1100 }, { name: 'plain beige suede moccasin', price: 950 }, { name: 'plain olive suede moccasin', price: 1050 }] }, { name: 'Gucci', shoes: [{ name: 'red leather laced sneakers', price: 800 }, { name: 'black leather laced sneakers', price: 900 }] }], result = renderLacedShoes(currentInventory); console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
let renderLacedShoes = (arr) => {
const array = [];
arr.forEach(elem => {
elem.shoes.forEach(names => {
let nameWords = names.name.split(" ");
nameWords.forEach((elem, i) => {
if (elem.indexOf("lace") >= 0) {
array.push({
nameWords: nameWords,
targetWordIndex: i
});
}
});
});
});
return array;
}
You can attempt it using a chain of map
and filter
to reach to desired solution您可以尝试使用一系列map
和filter
来达到所需的解决方案
var res = [{ name: 'Brunello Cucinelli', shoes: [{ name: 'tasselled black low-top lace-up', price: 1000 }, { name: 'tasselled green low-top lace-up', price: 1100 }, { name: 'plain beige suede moccasin', price: 950 }, { name: 'plain olive suede moccasin', price: 1050 }] }, { name: 'Gucci', shoes: [{ name: 'red leather laced sneakers', price: 800 }, { name: 'black leather laced sneakers', price: 900 }] }] .map(d => d.shoes.map(r => r.name)).flat() .filter(d => d.includes('lace')) .map(d => ({ nameWords: d.split(' '), targetWordIndex: d.split(' ').findIndex(d => d.includes('lace'))})) console.log(res)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.