【问题标题】:JavaScript: Filter Array of Shoe Objects for Specific Type of Shoes and Return Object Array with Index as PropertyJavaScript:针对特定类型的鞋子过滤鞋子对象数组并返回具有索引作为属性的对象数组
【发布时间】:2023-04-10 01:56:01
【问题描述】:

我有以下鞋子对象数组:

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}
    ]
  }
];

使用上面的currentInventory数组,我想找到所有的系带鞋,并指出哪个单词包含lace:

下面的期望输出:

[
  {
    "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
  }
]

以下是我尝试的代码;它接近但不完全在那里:

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)

我的代码输出:

[ { nameWords: [ 'tasselled', 'green', 'low-top', 'lace-up' ],
    targetWordIndex: 3 },
  { nameWords: [ 'black', 'leather', 'laced', 'sneakers' ],
    targetWordIndex: -1 } ]

我看到两个问题:它没有返回所有包含鞋的“鞋带”。此外,我的 targetWordIndex 已关闭。

我做错了什么?

【问题讨论】:

  • 快速测试显示您的indexOf 呼叫不适用于|| 运算符。它似乎只检查第一个字符串,如果没有找到它,则返回 -1。
  • 请改用Array.prototype.findIndex()。你说你只需要在这些词中寻找"lace"...所以看看实际的字符串是否包含它

标签: javascript arrays function object indexing


【解决方案1】:

您可以尝试使用mapfilter 的链来达到所需的解决方案

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)

【讨论】:

  • 谢谢你!我一直在尝试使用 filter、map、reduce 等数组方法来练习更多的问题......你有一个有很多好的练习问题的网站吗?
  • 您可以从官方 Mozilla 文档开始,一次选择一个主题,说“高阶函数”,然后参考一些电子书/网站以获得更深入的理解。其中一个好的是:eloquentjavascript.net
  • 顺便练习一下,我从 Stackoverflow 中挑选了最聪明的 JS 人,其中一个是 Nina,看到他们回答的问题,我先自己尝试,然后与他们的尝试进行比较。这有助于 ALOT 快速了解解决问题时必须采取的方法:)
【解决方案2】:
 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;
}

【讨论】:

    【解决方案3】:

    您不仅索引有问题,而且推送结果也有问题。这应该发生在内循环内部。

    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; }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-16
      • 2021-02-26
      • 2019-05-29
      相关资源
      最近更新 更多