我正在编写一个程序来获取商店库存并搜索该库存中的特定商品,将这些商品推送到数组中。库存是一个对象,该对象中的每个对象都是库存的一个项目。这些项目本身没有键 - 它们只是对象文字。因此,我使用快速枚举(对于产品中的项目)来阻止它们循环。每个项目都是这样的:
{ 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]识别为字符串,所以现在我被卡住了。我该怎样绕过这个?任何帮助表示赞赏。
干杯全部
答案 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));
希望这适合你!