首页 > 解决方案 > 从函数调用时数组未按预期返回

问题描述

我正在尝试迭代嵌套在数组中的嵌套对象数组。
我似乎无法获得良好的回报价值。
抱歉,我是新来的,所以这是我的第一个问题,我希望我的措辞正确,以符合您的理解,但我有代码可以显示任何方式。
如果我 console.log(newObjsForShoes)按预期工作,但如果我返回它不会,而且如果我将它推入一个数组,它只返回一个值。
下面的代码

function generateLaceDetails(inventory) {

    var arrOfInventory = [];
    var objInInventory = {};
    var arrOfLaceWords = [];
    var newObjsForShoes = {};
    for (var i = 0; i < inventory.length; i++) {
        for (var keys in inventory[i]) {
            if (Array.isArray(inventory[i][keys]) === true) {

                for (var j = 0; j < inventory[i][keys].length; j++) {
                    if (inventory[i][keys][j].name.includes('lace')) {
                        newObjsForShoes['nameWords'] = inventory[i][keys][j].name;

                        newObjsForShoes['nameWords'] = splitToArray(newObjsForShoes);

                        for (var index = 0; index < newObjsForShoes['nameWords'].length; index++) {
                            if (newObjsForShoes['nameWords'][index].includes('lace')) {
                                newObjsForShoes['targetWordIndex'] = index;

                                console.log(newObjsForShoes);
                                arrOfInventory.push(newObjsForShoes)
                                return arrOfInventory;
                            }
                        }
                    }
                }
            }
        }
    }
    // return arrOfInventory;
}

// var array = [];
// array.push(generateLaceDetails(currentInventory))
// console.log(array);

function splitToArray(objs) {
    var arrayOfSplitWords = [];
    for (var key in objs) {
        var splitWords = objs[key].split(" ");
        return splitWords;
    }

}

function assertEquals(actual, expected, testName) {
    actual = JSON.stringify(actual);
    expected = JSON.stringify(expected);
    if (actual === expected) {
        console.log('passed')
    } else {
        console.log('FAILED [' + testName + '] Expected ' + expected + ', but got ' + actual)
    }
}

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
            }
        ]
    }
];
var expectedResult = [{
        "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
    }
];

var actualObj = generateLaceDetails(currentInventory);

assertEquals(actualObj, expectedResult, "generate lace details")

标签: javascriptarraysmultidimensional-arrayfunctional-programmingassertion

解决方案


我认为你真的因为这个问题而复杂化了你的生活

const 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} 
  ] } ] 
  
  
function genLaceDetails(inv)
  {
  let res = []
  for (let invEl of inv)
  for (let keyEL in invEl)  
  if (Array.isArray(invEl[keyEL]))
  for (let row of invEl[keyEL])
  if (row.name.includes('lace'))
    {
    let nameWords       = row.name.split(' ')
      , targetWordIndex = nameWords.findIndex(x=>x.includes('lace'))
    res.push({nameWords, targetWordIndex})
    }
  return res
  }

const result = genLaceDetails( currentInventory )

console.log( result )
.as-console-wrapper {max-height: 100%!important;top:0}


推荐阅读