开发者问题收集

按对象中的多个值搜索

2015-12-07
11070

根据这些答案,我应该能够通过多个值搜索对象。

如何在 Javascript 中查找多维对象/数组中的值?

Javascript:如何根据属性过滤对象数组?

搜索多维数组 JavaScript

不幸的是, filter() 没有返回任何内容。 jQuery 的 grep() 也是如此。

Google 了 5 页,仍然找不到解决方案。

请帮忙。谢谢

https://jsfiddle.net/4z90rvk3/

var itemPrices = {
        '1':  { 'catid': '1', 'typeid': '1', 'price': '1000' },
        '2':  { 'catid': '1', 'typeid': '2', 'price': '1000' },
        '3':  { 'catid': '1', 'typeid': '3', 'price': '1100' },
        '4':  { 'catid': '2', 'typeid': '1', 'price': '1000' },
        '5':  { 'catid': '2', 'typeid': '2', 'price': '1000' },
        '6':  { 'catid': '2', 'typeid': '3', 'price': '1100' },
        '7':  { 'catid': '3', 'typeid': '1', 'price': '1200' },
        '8':  { 'catid': '3', 'typeid': '2', 'price': '1200' },
        '9':  { 'catid': '3', 'typeid': '3', 'price': '1300' },
        '10':  { 'catid': '4', 'typeid': '1', 'price': '1200' },
        '11':  { 'catid': '4', 'typeid': '2', 'price': '1200' },
        '12':  { 'catid': '4', 'typeid': '3', 'price': '1300' },
    };

    var price = itemPrices.filter(function(item) { return item.typeid == 1 && item.catid == 2; });

    $('body').append(price);
3个回答

filter() 函数仅适用于数组。因此,您需要将 itemPrices 设为数组。有两种方法可以将对象转换为数组:

第一种方法是,如果您可以更改对象,请为其添加 length 属性,然后使用 Array.prototype.slice.call(itemPrices) 方法将其设为数组,请查看 更新后的 jsfiddle

第二个比较容易理解:

var itemPrices = {
		'1':  { 'catid': '1', 'typeid': '1', 'price': '1000' },
		'2':  { 'catid': '1', 'typeid': '2', 'price': '1000' },
		'3':  { 'catid': '1', 'typeid': '3', 'price': '1100' },
		'4':  { 'catid': '2', 'typeid': '1', 'price': '1000' },
		'5':  { 'catid': '2', 'typeid': '2', 'price': '1000' },
		'6':  { 'catid': '2', 'typeid': '3', 'price': '1100' },
		'7':  { 'catid': '3', 'typeid': '1', 'price': '1200' },
		'8':  { 'catid': '3', 'typeid': '2', 'price': '1200' },
		'9':  { 'catid': '3', 'typeid': '3', 'price': '1300' },
		'10':  { 'catid': '4', 'typeid': '1', 'price': '1200' },
		'11':  { 'catid': '4', 'typeid': '2', 'price': '1200' },
		'12':  { 'catid': '4', 'typeid': '3', 'price': '1300' },
	};

var arr = [];

for (var item in itemPrices) {
  if (itemPrices.hasOwnProperty(item)) {
        arr.push(itemPrices[item])
  }
}

var price = arr.filter(function(item) { return item.typeid == 1 && item.catid == 2; });
	
console.log(price);

参考:

Array.prototype.filter() - MDN

Array.prototype.slice.call 是如何工作的? - Stack Overflow

iplus26
2015-12-07

这可能有效。 过滤函数仅适用于数组。

 var itemPrices = [
            { 'catid': '1', 'typeid': '1', 'price': '1000' },
            { 'catid': '1', 'typeid': '2', 'price': '1000' },
            { 'catid': '1', 'typeid': '3', 'price': '1100' },
            { 'catid': '2', 'typeid': '1', 'price': '1000' },
            { 'catid': '2', 'typeid': '2', 'price': '1000' },
            { 'catid': '2', 'typeid': '3', 'price': '1100' },
            { 'catid': '3', 'typeid': '1', 'price': '1200' },
            { 'catid': '3', 'typeid': '2', 'price': '1200' },
            { 'catid': '3', 'typeid': '3', 'price': '1300' },
            { 'catid': '4', 'typeid': '1', 'price': '1200' },
            { 'catid': '4', 'typeid': '2', 'price': '1200' },
            { 'catid': '4', 'typeid': '3', 'price': '1300' },
        ];

  var price = itemPrices.filter(function(item) { return item["typeid"] == 1 && item["catid"] == 2; });
FurkanO
2015-12-07

我知道这有点过分,但我喜欢这样做 假设你的对象有两个属性,例如类型和标题

var searchCategory = $('body .category-selector').val().toLowerCase().trim();
    var searchText = $('body #search-text').val().toLowerCase().trim();

    if (!searchText) {
        searchText = false;
    }
    if (searchCategory === 'all') {
        searchCategory = false;
    }

    var result = gamesData;

    if (searchText !== false) {
        result = result.filter(function(singleGame) {
            var current_title = singleGame.title.toLowerCase().trim();
            return current_title.indexOf(searchText) === -1 ? false : true;
        });
    }

    if (searchCategory !== false) {
        result = result.filter(function(singleGame) {
            var current_category = singleGame.type.toLowerCase().trim();

            return current_category == searchCategory;
        });
    }

    return result;
coder618
2020-06-17