访问对象对象中的特定对象

时间:2016-03-01 02:07:18

标签: javascript string loops object

我正在编写一个程序来获取商店库存并搜索该库存中的特定商品,将这些商品推送到数组中。库存是一个对象,该对象中的每个对象都是库存的一个项目。这些项目本身没有键 - 它们只是对象文字。因此,我使用快速枚举(对于产品中的项目)来阻止它们循环。每个项目都是这样的:

{   id: 2759167427,   
    title: 'Practical Silk Bag',   
    handle: 'practical-silk-bag',  
    vendor: 'Legros, Willms and Von',  
    product_type: 'Bag'
}

我正在尝试将项目对象推送到数组中,当且仅当该项目是键盘或计算机时。为此我尝试使用这样的东西:

var kbComps = [];

//loop through the inventory, looking for everything that is a keyboard or a computer
for (var key in products) {
    var item = products[key];
    for (var property in item) {
        if (item[property].includes("Computer") ||  item[property].includes("Keyboard")) {
            kbComps.push(item);
        }
    }
}

但是我收到一个错误,告诉我include不是一个定义的方法,这意味着程序没有将item [title]识别为字符串,所以现在我被卡住了。我该怎样绕过这个?任何帮助表示赞赏。

干杯全部

3 个答案:

答案 0 :(得分:1)

在循环的第一次迭代中,你要检查id是否包含一个字符串,但id是一个数字,因此.includes失败。

我不确定您的意图是什么,但您可能只想检查.include如果该项目是字符串。

if (typeof item[property] === 'string' && (item[property].includes("Computer") || item[property].includes("Keyboard"))) {

如果你输入一些控制台日志,你可以看到发生了什么。 https://jsfiddle.net/qexssczd/1/

答案 1 :(得分:1)

答案 2 :(得分:1)

<强>已更新

我将实现更改为循环对象而不是数组。我认为这就是你要找的东西。

<强> Here is a working jsBin

可能这有点简单,我相信它会对你有用

// Products base data
var productsData = {
    a: {
        id: 2759167427,
        title: 'Practical Silk Bag',
        handle: 'practical-silk-bag',
        vendor: 'Legros, Willms and Von',
        product_type: 'Bag',
    },
    b: {
        id: 2759167417,
        title: 'Practical Silk Bag 2',
        handle: 'practical-silk-bag-2',
        vendor: 'Legros, Willms and Von 2',
        product_type: 'Bag 2',
    },
    c: {
        id: 2759167417,
        title: 'Practical Silk Bag 3',
        handle: 'practical-silk-bag-3',
        vendor: 'Legros, Willms and Von 3',
        product_type: 'Computer', // This product must be returned
    },
    d: {
        id: 2759167417,
        title: 'Practical Silk Bag 4',
        handle: 'practical-silk-bag-4',
        vendor: 'Legros, Willms and Von 4',
        product_type: 'Keyboard', // This product must be returned
    }
};


/**
 * Function to find products by any condition
 */
function searchItemsByCondition(products, evaluateCondition) {

    var ans = [];

    for (var item in productsData) {
        // Making sure the object has the property product_type
        if (products[item].hasOwnProperty('product_type')) {
            if (evaluateCondition(products[item])) {
                ans.push(products[item]);
            }
        }
    }
    return ans;
}

function searchByKeyboardOrComputer(product) {
    return (product.product_type === 'Computer') || (product.product_type === 'Keyboard');
}


// Call the function passing the evaluation function to satisfy.
// It should log only the items with 'Keyboard' or 'Computer' product_type
console.log(searchItemsByCondition(productsData, searchByKeyboardOrComputer));

希望这适合你!