JavaScript:如何获取以特定字符串开头的对象的所有键和值?

时间:2013-12-10 03:06:56

标签: javascript

我正在尝试获取以imageIds开头的对象的所有键和值。

我的对象如下所示:

{
    title: 'fsdfsd',
    titleZh: 'fsdfsd',
    body: 'fsdf',
    bodyZh: 'sdfsdf',
    imageIds: '/uploads/tmp/image-3.png',
    imageIdsZh: '' 
}

但我只需要属性imageIdsimageIdsZh。但是明天,一个对象可能包含imageIdsBlah,我也需要把它拿起来。我可以从对象中删除前几个属性,但是下一个对象可能包含其他属性,例如foo: 'bar'

5 个答案:

答案 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);

演示:http://jsfiddle.net/ngX4m/

一些小的解释:

  1. 我们使用Array.prototype.filter()函数来过滤掉以`imageIds2
  2. 开头的键
  3. 我们使用Array.prototype.reduce()将过滤后的密钥数组转换为key-value对的对象。为此我们使用{}的初始值(一个空对象),填充它并从每个执行步骤返回。
  4. <强> 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 */
]

工作jsfiddle here

当然,人们也可以只推动价值观: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}内置的少数内容之外的功能抽象功能的更多功能。 }。

您可以 see it in action on JSFiddle

答案 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;
}    

**我希望这很有帮助。如果您有任何其他问题,请随时与我们联系。祝你好运。 **