首页 > 试题广场 >

属性遍历

[编程题]属性遍历
  • 热度指数:43358 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
找出对象 obj 不在原型链上的属性(注意这题测试例子的冒号后面也有一个空格~)
1、返回数组,格式为 key: value
2、结果数组不要求顺序
示例1

输入

var C = function() {this.foo = 'bar'; this.baz = 'bim';}; 
C.prototype.bop = 'bip'; 
iterate(new C());

输出

["foo: bar", "baz: bim"]
推荐
可以使用for-in来遍历对象中的属性,hasOwnproperty方法能返回一个布尔值,指出一个对象是否具有指定名称的属性。此方法无法检查该对象的原型链中是否具有该属性,该属性必须为对象本身的属性。
function iterate(obj) {
     var arr = [];
     //使用for-in遍历对象属性
     for(var key in obj){
         //判断key是否为对象本身的属性
         if(obj.hasOwnProperty(key)){
             //将属性和值按格式存入数组
             arr.push(key+": "+obj[key]);
         }
     }
     return arr;
 }

编辑于 2015-12-11 10:49:16 回复(24)
function iterate(obj) {
    let result=[],str
    for(prop in obj){
        // prop为obj自有属性且obj原型没有该属性
        if(obj.hasOwnProperty(prop)&&!obj.constructor.prototype.hasOwnProperty(prop)){
            str=`${prop}: ${obj[prop]}`
            result.push(str)
        } 
    }
    return result
}
发表于 2022-01-05 17:16:44 回复(0)
function iterate(obj) {
    let v = []
    for(var i of Object.keys(obj)){
        v.push(i+': '+obj[i])
    }
    return v
}

发表于 2021-08-26 14:15:16 回复(0)
function iterate(obj) {
    // Object.keys() 返回当前对象中所有可枚举属性所组成的数组
    return Object.keys(obj).map(key => `${key}: ${obj[key]}`)
}

发表于 2021-08-08 00:34:32 回复(0)
总结了一下前人的经验
/*
function iterate(obj) {
    var arr =[];
    for(var i in obj){
        //if!((i in obj.__proto__))
        if(obj.hasOwnProperty(i))
            arr.push(i+": " + obj[i]);
    }
    return arr;
}
*/

//map
/*
function iterate(obj){
    return Object.getOwnPropertyNames(obj).map(function(key){
        return key+": "+obj[key]
    })
}
*/

/*
function iterate(obj){
    return Object.keys(obj).map(function(key){
        return key+": "+obj[key]
    })
}
*/

/*
function iterate(obj) {
    //解构赋值
    return Object.entries(obj).map(([k,v])=>k+":"+v)
}
*/

//forEach

/*
function iterate(obj){
    var arr =[];
    Object.getOwnPropertyNames(obj).forEach(function(key){
        arr.push(key+": "+obj[key]);
    })
    return arr;
}
*/

/*
function iterate(obj){
    var arr = [];
    Object.keys(obj).forEach(function(key){
        arr.push(key+": "+obj[key])
    })
    return arr;
}
*/

/*
    //浏览器可以通过,不知道什么问题
function iterate(obj) {
    var arr =[];
    //解构赋值
    Object.entries(obj).forEach(([k,v])=> arr.push(k+": "+v));
    return arr;                          
}
*/
发表于 2021-01-30 10:23:04 回复(0)
function iterate(obj) {
    let arr=[];
    Object.getOwnPropertyNames(obj).forEach(key=>{
        arr.push(key+': '+obj[key]);
    })
    return arr;
}

发表于 2020-06-28 17:11:08 回复(0)
function iterate(obj) {
    var arr=[];
    //Object.keys(obj)==> ['foo','baz']遍历
    Object.keys(obj).forEach(function(item) {
        //拼键值
       arr.push(item + ': ' + obj[item])
     })
    return arr;
}
var C = function() {this.foo = 'bar'; this.baz = 'bim';}; 
C.prototype.bop = 'bip'; 
iterate(new C());

发表于 2018-10-08 23:34:44 回复(0)
function iterate(obj) {
	var result = [];

  for (var prop in obj) {
    if (obj.hasOwnProperty(prop)) {
      result.push(prop + ": " + obj[prop])
    }
  }
  
  return result;
}


发表于 2017-05-17 23:23:53 回复(0)
    function iterate(obj) {
            var arr = [];
            for (var x in obj) {
                if (!(x in obj.__proto__)){
                    arr.push(x + ": " + obj[x]);
                }
            }
            return arr;
        }

发表于 2016-11-21 16:44:29 回复(1)
可以直接用Object.prototype.getOwnPropertyNames(obj)获取所有的自由属性(可枚举与不可枚举的)。for-in 加上hasOwnProperty的组合只能获取所有的自由可枚举属性。
function iterate(obj) {
    var result=Object.getOwnPropertyNames(obj);
    var length=result.length;
    for(var i=0;i<length;i++){
        var name=result[i]
        result[i]=result[i]+": "+obj[name];
    }
    return result;
}

编辑于 2016-08-15 13:32:37 回复(1)
/*用for-in遍历可枚举的属性,用hasOwnProperty()方法判断是否是自有属性(即不在原型链上)*/
function iterate(obj) {
    var res=[];
	for(prop in obj){
        if(obj.hasOwnProperty(prop)){
            res.push(prop+":"+" "+obj[prop]);
        }
    }
    return res;
}

发表于 2016-03-07 16:30:09 回复(1)
洁头像
function iterate(obj) {
    var arr=[];
    for(var i in obj){
        if(obj.hasOwnProperty(i)){
            var str=i+": "+obj[i];
            arr.push(str);
        }
    }
    return arr;
}

发表于 2015-08-14 16:45:26 回复(0)
function iterate(obj) {
    return Object.getOwnPropertyNames(obj).map(function(key){
        return key+": "+obj[key];
    });
}

发表于 2015-09-29 18:13:35 回复(5)
题目要求找不在原型链上的属性,即返回实例属性,有3种正确方法(按提交运行速度由快到慢排列):
1. Object.keys 方法(156 ms)
返回可枚举的实例属性的数组。
function iterate(obj) {
    return Object.keys(obj).map(function(key) {
        return key + ": " + obj[key];
    });
}

2. for-in 和 hasOwnProperty 方法(171 ms)
前者用于遍历所有属性,后者用于判断是否为实例属性。
function iterate(obj) {
    const res = [];
    for (var prop in obj) {
        if (obj.hasOwnProperty(prop)) {
            res.push(prop + ": " + obj[prop]);
        }
    }
    return res;
}
3. Object.getOwnPropertyNames 方法(209 ms)
用法跟1.一样,区别在于返回的是所有实例属性(包括不可枚举的)。
function iterate(obj) {
    return Object.getOwnPropertyNames(obj).map(function(key) {
        return key + ": " + obj[key];
    });
} 

注意:
1. 居然不支持 let。。。。。。改成 var 就行了(手动微笑)
2. 是的,箭头函数也不支持。。。
3. 题目没有说明返回的实例属性是否包括不可枚举的,这里理解为包括。否则,由于 Object.keys() 返回的仅为可枚举的实例属性,应该无法通过。
发表于 2018-07-13 17:57:48 回复(3)
Object.keys 只收集自身属性名,不继承自原型链上的属性,所以可以直接这么写
		function iterate(obj) {
			var arr=Object.keys(obj);
		    var arrs=[];
		    arr.forEach(function(item){
		        arrs.push(item+': '+obj[item])
		    })
		   
		    return arrs
		    
		}

发表于 2016-10-30 21:32:06 回复(1)

通过改变原型链,这样 for-in 就只能找到对象里的属性了。

function iterate(obj) {  
    obj.__proto__ = null;
    var arr = [];
    for(var key in obj){
        var _ = key+': '+obj[key];  arr.push(_);
    } return arr;
}
编辑于 2017-12-06 20:12:14 回复(1)
function iterate(obj) {
    var arr = [];
	for(var item in obj){
        if(obj.hasOwnProperty(item)){
            var str = item+": "+obj[item];
            arr.push(str);
        }
    }
    return arr;
}

测试通过!
= =仙人板板的,又是空格 空格!!!空格泥煤 = =  还以为哪里错了 ,一直在找

发表于 2017-04-10 17:50:08 回复(1)
发表于 2015-12-10 22:52:46 回复(0)
function iterate(obj) {
    var arr = Object.keys(obj);
    var res = [];
    arr.forEach( e => res.push(e+": "+obj[e]));
    return res;
}

function iterate(obj) {
    return Object.getOwnPropertyNames(obj).map(e => { return e + ": " + obj[e] });
}


编辑于 2020-03-26 14:28:00 回复(0)
function iterate(obj) {
    return Object.entries(obj).map(([k,v])=>k+":"+v)
}
发表于 2019-03-04 22:00:35 回复(1)
function iterate(obj) {
    var k = Object.keys(obj);
    var res = [];
    k.forEach(function(key){
        res.push(key+": "+obj[key]);
    });
    return res;
}

//test
var C = function() {this.foo = 'bar'; this.baz = 'bim';}; 
C.prototype.bop = 'bip'; 
iterate(new C());

发表于 2018-07-05 17:34:12 回复(0)