试图理解Javascript数组

试图理解Javascript数组,javascript,arrays,Javascript,Arrays,所以我有一些数组 var item = [{ name : "somename", type1 : "wood", location : "some location", desc : "some description" }, { name : "somename", type1 : "metal", location : "somelocation", desc : "some description" }]; 及 我假设最后

所以我有一些数组

var item = [{
    name : "somename",
    type1 : "wood",
    location : "some location",
    desc : "some description"
}, {
    name : "somename",
    type1 : "metal",
    location : "somelocation",
    desc : "some description"
}];

我假设最后一个数组有两个空数组。稍后,我尝试在函数中使用这些

function shop() {
    for (var i = 0; i < item.length; i++) {
        if (item[i].location == "some location") {
            //get all items at some location
            hasInv[i] = item[i];
        }
    }
    if (shopState == 1) {
        var d = 1;
        for (var i = 1; i < hasInv.length; i++) {
            if (hasInv[i].type1 == 'wood') {
                //get all wood items at some location 
                pickedItem[d] = hasInv[i];
                d++;
                console.log(pickedItem);
            }
        }
    }
}
功能商店(){
对于(变量i=0;i

带有
pickedItem
的最后一位返回未定义,除非我声明
pickedItem=[]
shopState
中,我以为我已经在文件开头声明了它。当我这样做时,它会起作用,但我试图理解,如果我不这样做,为什么它不会起作用。

有几个问题:您是否有条件通过
shopState
?我看不出你在哪里。还有一个原因是您直接设置索引而不是使用.push或.unshift吗?也许是为了时间复杂性的考虑?我假设该函数的目的是遍历存储位置以查找匹配的位置,然后在该位置查找特定类型的所有项目?对吗?如果这是真的,那么这里就是解决方案:

function shop() {
    for (var i = 0; i < item.length; i++) {
        if (item[i].location == "some location") {
            //get all items at some location
            hasInv.push(item[i]);
            //You weren't increment shopState
            shopState++;
        }
    }
    if (shopState == 1) {
    //conditional now passes
    //there is no need to set a additional index variable.
        for (var i = 0; i < hasInv.length; i++) {
            if (hasInv[i].type1 == 'wood') {
                //get all wood items at some location
                pickedItem.push(hasInv[i]);
                console.log(pickedItem);
            }
        }
    }
}

shop()

同样,您只检查了一个位置,因为您已将单词some和location组合在items数组的第二个对象中。

您应该使用
var d
为什么,在第二个
for
循环中,您是从
1
开始的?使用您提供的代码,它将永远不会运行循环体(因为
hasInv
在索引
0
处只有一个项目,您对
pickedItem
还做了什么?您能把整个文件作为一个整体显示给我们吗,包括对
商店的调用
hasInv[i].type
,而对象的属性是
type1
。如果您解决了索引和属性名称的问题,它就可以正常工作。但即使没有这些,未定义的
pickedItem
也没有问题
function shop() {
    for (var i = 0; i < item.length; i++) {
        if (item[i].location == "some location") {
            //get all items at some location
            hasInv.push(item[i]);
            //You weren't increment shopState
            shopState++;
        }
    }
    if (shopState == 1) {
    //conditional now passes
    //there is no need to set a additional index variable.
        for (var i = 0; i < hasInv.length; i++) {
            if (hasInv[i].type1 == 'wood') {
                //get all wood items at some location
                pickedItem.push(hasInv[i]);
                console.log(pickedItem);
            }
        }
    }
}

shop()
if(shopState >= 1)