我正在尝试获取以imageIds
开头的对象的所有键和值。
我的对象如下所示:
{
title: 'fsdfsd',
titleZh: 'fsdfsd',
body: 'fsdf',
bodyZh: 'sdfsdf',
imageIds: '/uploads/tmp/image-3.png',
imageIdsZh: ''
}
但我只需要属性imageIds
和imageIdsZh
。但是明天,一个对象可能包含imageIdsBlah
,我也需要把它拿起来。我可以从对象中删除前几个属性,但是下一个对象可能包含其他属性,例如foo: 'bar'
答案 0 :(得分:23)
一些功能风格很棒:
var data = {
title: 'fsdfsd',
titleZh: 'fsdfsd',
body: 'fsdf',
bodyZh: 'sdfsdf',
imageIds: '/uploads/tmp/image-3.png',
imageIdsZh: ''
};
var z = Object.keys(data).filter(function(k) {
return k.indexOf('imageIds') == 0;
}).reduce(function(newData, k) {
newData[k] = data[k];
return newData;
}, {});
console.log(z);
一些小的解释:
Array.prototype.filter()
函数来过滤掉以`imageIds2 Array.prototype.reduce()
将过滤后的密钥数组转换为key-value
对的对象。为此我们使用{}
的初始值(一个空对象),填充它并从每个执行步骤返回。<强> UPD 强>:
来自@GitaarLAB的公平更新:
Object.keys
是ES5,但返回对象自己的属性(因此不需要obj.hasOwnProperty(key)
)
答案 1 :(得分:2)
根据对象的大小,这可能无法很好地扩展,但它可以正常工作
for(key in obj){
if(obj.hasOwnProperty(key)){
if(key.indexOf("imageIds")===0){
//do something
}
}
}
答案 2 :(得分:1)
还需要将hasOwnProperty
与for-in循环结合使用(大多数当前之前的答案中未提及)。
原因是for-in循环还将覆盖对象从原型链中继承的方法/属性(如果有人或某些库添加了自定义内容)。
所以你正在寻找像这样简单可靠的东西:
function fetch(obj, str){
var key, results = [];
for(key in obj) obj.hasOwnProperty(key)
&& key.indexOf(str) === 0
&& results.push([ key, obj[key] ]);
return results;
}
注意:你也可以将这个函数命名为'getAllKeysAndValuesStartingWith'(或者你应该为军队工作gakavsw哈哈)。 子>
<强>用法:强>
fetch(object, string)
返回一个简单的(to loop over)数组,其中包含找到的结果,
所以var my_results = fetch(testObj, 'imageId');
会给出以下输出:
[ //array of arrays
['imageIds', '/uploads/tmp/image-3.png']
, ['imageIdsZh', ''] /*
, [key, value] and more if it finds them */
]
当然,人们也可以只推动价值观:results.push(obj[key])
我建议不要返回一个对象((results[key]=obj[key])
),因为在这种情况下数组更容易使用。
希望这有帮助!
答案 3 :(得分:1)
根据 @zerkms 的答案,我一直在为Javascript工作 functional programming library 。使用该库中的工具,这将变成(有点密集)单行:
var data = {
title: 'fsdfsd',
titleZh: 'fsdfsd',
body: 'fsdf',
bodyZh: 'sdfsdf',
imageIds: '/uploads/tmp/image-3.png',
imageIdsZh: ''
};
var x = pick(filter(compose(eq("imageIds"), substring(0,8)), keys(data)), data);
console.log(x);
此代码不一定比发布的 @zerkms 更好,但它确实展示了除{{1}内置的少数内容之外的功能抽象功能的更多功能。 }。
答案 4 :(得分:0)
// json to be searched
var data = {
title: 'fsdfsd',
titleZh: 'fsdfsd',
body: 'fsdf',
bodyZh: 'sdfsdf',
imageIds: '/uploads/tmp/image-3.png',
imageIdsZh: ''
};
// takes the json 'data' as its 1st parameter
// and the desired 'property' to be searched as the 2nd parameter
// for loop iterates through the entire json
// if the property parameter matches a 'key' name in json e.g. 'imageIds'
// then the value for that property is returned
function fetchProperty (data, property) {
for(var key in data) {
if(key === property) {
return data[key];
}
}
}
// if you wanted to return a bunch of data according to a particular key - value pair
// you could do something like this...
// assume 'array' contains a bunch of jsons
// newData will hold jsons containing your newly fetched data points
function fetchNewData() {
var newData = [];
for(var i = 0; i < array.length; i++) {
var value1 = fetchProperty(array[i], 'imageIds');
var value2 = fetchProperty(array[i], 'imageIdsZh');
var value3 = fetchProperty(array[i], 'imageIdsBlah');
var tempJSON = {};
tempJSON.imageIds = value1;
tempJSON.imageIdsZh = value2;
tempJSON.imageIdsBlah = value3;
newData.push(tempJSON);
}
return newData;
}
**我希望这很有帮助。如果您有任何其他问题,请随时与我们联系。祝你好运。 **