从不同级别的对象获取属性名称的值

时间:2016-03-19 20:14:23

标签: javascript jquery json linq object

我有一个以下格式的对象,我需要从对象的所有级别的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;
    }
});

3 个答案:

答案 0 :(得分:3)

您可以使用递归函数来测试属性的名称类型及其类型。如果它的名称是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

答案 1 :(得分:1)

您可以使用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>
&#13;
&#13;
&#13;

这是有效的,因为jQuery&#39; s $.map具有奇怪的功能,如果你从回调中返回一个数组,它会变得扁平化为结果。

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

如果您愿意,可以选中typeof obj === "object"来避免一些来电。

答案 2 :(得分:0)

您可以使用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)