我有一个JS对象可能看起来像下列之一:
// Example #1:
var data = {
product: {
value1: 'v1',
value2: 2
}
}
// Example #2:
var data = {
order: {
value1: 1
}
}
// Example #3:
var data = {
value1: 1
}
我想要实现的目标:
var inputName = 'product[value1]';
var data = {
product: {
value1: 'v1',
value2: 2
}
}
var value = something(data, inputName); // should return v1
inputName和data可以更改,我可以使用带有input {'product[value2]'
,'order[value1]'
,'value1'
的任何上述数据对象。
我的猜测是使用正则表达式并获取两个属性名称。这是更好的方式吗?
答案 0 :(得分:1)
你可以使用下划线js _.each迭代对象,如
_.each(data ,function(product){
console.log(product.value);
});
请参阅链接:http://underscorejs.org/#each
你也可以用于每个循环。
您也可以执行以下过滤:
_.filter(data, function(product){
return product.value;
});
答案 1 :(得分:0)
如果要为函数提供类似'product[value1]'
的字符串作为参数,则需要获取查询结果值所需的所有属性值。我用query.replace(/(\[)|(\])/g, ' ')split(' ')
做到了。返回的数组需要检查空字符串并将其删除。我是用filter
做的
之后,您只需在返回的数组上使用reduce
即可在每次迭代时获得新值。在最后一次迭代中,您得到了结果。
function getDataValue(obj, query) {
var attributes = getAttributeNames(query)
return attributes.reduce(function(value, current) {
return value[current]
}, obj)
}
function getAttributeNames(query) {
return query.replace(/(\[)|(\])/g, ' ')
.split(' ')
.filter(function(string) {
return string.length > 0
})
}
var dataOne = {
product: {
value1: 'v1',
value2: 2
}
}
var dataTwo = {
product: {
subProduct: {
value1: 'v2'
}
}
}
console.log(getDataValue(dataOne, 'product[value1]'))
console.log(getDataValue(dataTwo, 'product[subProduct][value1]'))
function getDataValue(obj, query) {
var attributes = getAttributeNames(query)
return attributes.reduce(function(value, current) {
return value[current]
}, obj)
}
function getAttributeNames(query) {
return query.replace(/(\[)|(\])/g, ' ')
.split(' ')
.filter(function(string) {
return string.length > 0
})
}
答案 2 :(得分:0)
另一种方法是创建一个直接迎合搜索的字典。
您可以展平多级键值对,以创建可以轻松使用的词典。下面的flatten
函数(taken from here)创建了一个字典,如:
{
"product.value1": "v1",
"product.value2": 2
}
然后,您可以使用dictionary["product.value1"]
如果您愿意,可以更改此展平功能以格式化product[value1]
等键。
var data = {
product: {
value1: 'v1',
value2: 2
}
}
var myDictionary = flatten(data);
console.log(myDictionary);
console.log(myDictionary["product.value1"]);
console.log(myDictionary["product.something else"]);
function flatten(obj, opt_out, opt_paths) {
var out = opt_out || {};
var paths = opt_paths || [];
return Object.getOwnPropertyNames(obj).reduce(function(out, key) {
paths.push(key);
if (typeof obj[key] === 'object') {
flatten(obj[key], out, paths);
} else {
out[paths.join('.')] = obj[key];
}
paths.pop();
return out;
}, out)
}
答案 3 :(得分:0)
如果您知道可能的属性名称,那么我将定义一个带有可能属性名称的数组,然后迭代它们检查是否有一个具有此名称的字段
const names = [
'product',
'order'
];
function findValue(data){
if(data.value1) return data.value1;
for(let name in names){
if(data[name].value1) return data[name].value1;
}
}