【问题标题】:Get values by property name from an object at different levels从不同级别的对象中按属性名称获取值
【发布时间】:2016-07-06 12:30:26
【问题描述】:

我有一个以下格式的对象,我需要从对象所有级别的Price 属性中获取所有值。

var o = {
    Id: 1,
    Price: 10,
    Attribute: {
        Id: 1,
        Price: 2,
        Modifier: {
            Id: 34,
            Price: 33
        }
    }
};

我在考虑 LinqToJS 和 jquery.map() 方法,但我想获得一个尽可能通用的方法。我试过了,但它只适用于第一级:

var keys = $.map(o, function(value, key) {
    if (key == "Price") {
        return value;
    }
});

【问题讨论】:

  • 想要将所有级别的价格作为一个数组?喜欢[10,2,33...] ??

标签: javascript jquery json linq object


【解决方案1】:

您可以使用递归函数来测试属性名称的类型及其类型。如果它的名称是Price,则将其添加到数组中。如果它是一个对象,则通过该对象递归找到一个Price 键。试试这个:

function getPrices(obj, arr) {
    $.each(obj, function(k, v) {
        if (k == "Price")
            arr.push(v);
        else if (typeof(v) == 'object')
            getPrices(obj[k], arr);
    });
    return arr;
}

var prices = getPrices(o, []);
console.log(prices); // = [10, 2, 33]

Working example

【讨论】:

  • 没问题。如果有帮助,请不要忘记投票/接受答案。
【解决方案2】:

您可以使用 jQuery 的 $.map() 非常轻松地做到这一点:

var o = {
  Id: 1,
  Price: 10,
  Attribute: {
    Id: 1,
    Price: 2,
    Modifier: {
      Id: 34,
      Price: 33
    }
  }
};


var res = $.map(o, function mapper(obj, key) {
  return key === "Price" ? obj : $.map(obj, mapper)
});


document.querySelector("pre").textContent = JSON.stringify(res)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
<pre></pre>

这是因为 jQuery 的 $.map 有一个奇怪的功能,如果你从回调中返回一个数组,它会被展平到结果中。

因此,我们可以在不是Price 键的任何东西上使用相同的函数递归调用$.map,它返回的数组将被清空到最终结果中。

如果你愿意的话,如果你检查typeof obj === "object",你可以避免一些电话。

【讨论】:

    【解决方案3】:

    你可以使用for..in循环、递归

    var o = {
        Id: 1,
        Price: 10,
        Attribute: {
            Id: 1,
            Price: 2,
            Modifier: {
                Id: 34,
                Price: 33
            }
        }
    };
    
    var res = [];
    
    (function re(obj) {
    for (var prop in obj) {
      if (prop === "Price") {
        res.push(obj[prop])
      } else {
        re(obj[prop])
      }
    }
    }(o));
    
    console.log(res)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多