2016-03-19 131 views
7

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

希望各级为阵列的价格是多少?像'[10,2,33 ...]'?? –

回答

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

+0

很好。谢谢! –

+0

没问题。如果有帮助,不要忘记加注/接受答案。 –

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>

这工作,因为奇数功能jQuery的$.map具有这样的如果你从回调中返回一个数组,它会变成平铺的结果。

因此,我们可以在任何不是Price键的情况下递归调用$.map,它的返回数组只会被清空到最终结果中。

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

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)