【问题标题】:Search by multiple values in object按对象中的多个值搜索
【发布时间】:2016-03-11 16:04:21
【问题描述】:

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

How to find a value in a multidimensional object/array in Javascript?

Javascript: How to filter object array based on attributes?

Search multi-dimensional array 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);

【问题讨论】:

标签: javascript


【解决方案1】:

我知道这有点矫枉过正,但我​​喜欢这样做 假设您的对象有两个属性,例如。类型和标题

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;

【讨论】:

    【解决方案2】:

    filter() 函数仅适用于数组。所以你需要将itemPrices 设为一个数组。将对象转换为数组有两种方法:

    第一个是,如果您可以更改对象,请为其添加length 属性,然后使用Array.prototype.slice.call(itemPrices) 方法使其成为数组,请查看updated 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

    How does Array.prototype.slice.call work? - Stack Overflow

    【讨论】:

    • 你的 jsfiddle = 我的;
    • 对不起,我不明白你的意思。你的对象没有改变,并且创建了一个新数组......你能给我一个例子来说明清楚吗?
    • 我需要将length: 12, 与对象中的实际项目数相匹配吗?
    • @AlexG 是的...如果您使用第一种方式,则必须知道对象的“长度”才能使其类似于数组。或者如果你尝试第二个,你不需要知道长度。
    【解决方案3】:

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

     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; });
    

    【讨论】:

    • 你省略了我的键 (1,2,3,4...)。 =)
    • 我这样做是因为数组已经有了这些键。希望对你有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-03
    • 1970-01-01
    • 2020-05-18
    • 2022-10-04
    • 1970-01-01
    • 1970-01-01
    • 2015-10-17
    相关资源
    最近更新 更多