Javascript 迭代对象文字值

Javascript 迭代对象文字值,javascript,Javascript,我有一个标准的jQuery插件,可以在顶部创建默认设置: jQuery.fn.myPlugin = function(options) { var defaults = { starts: "0px,0px", speed: 250, ... }; o = $.extend(defaults, options); } 我还有另一个变量名为numberOfObjects 我试图循环使用默认变量。对于找到的每个对象(从numberOfO

我有一个标准的jQuery插件,可以在顶部创建默认设置:

jQuery.fn.myPlugin = function(options) { 
    var defaults = {  
        starts: "0px,0px",
        speed: 250, ...
    };
    o = $.extend(defaults, options);
}
我还有另一个变量名为
numberOfObjects

我试图循环使用默认变量。对于找到的每个对象(从
numberOfObjects
),我需要复制变量值的值。因此,如果
numberOfObjects
变量为3,则
默认.start
应为
0px,0px>0px,0px>0px,0px
。而;用于拆分值

这就是我现在拥有的
X
表示默认值中的变量名
Y
表示
x
当前值的变量。我已经走了这么远,不知道下一步该怎么办

for (x in defaults) {   // x is defaults.x
    defaults.x = defaults.x + " > y";
}
或者使用jQuery:

$.each(obj, function(key, value) {
    console.log(this, value, obj[key]);
});
在代码中:

for(x in defaults){
   defaults.x = defaults.x + " > y";
}
你需要说
defaults[x]
而不是
defaults.x


x
是一个包含字符串的变量,该字符串是
默认值
对象的键,括号(数组样式)语法允许您使用该变量获取属性。使用点表示法
defaults.x
正在寻找一个实际称为“x”的属性,这相当于
defaults[“x”]

您不必依赖jQuery来实现这一点

Object.keys(obj).forEach(function (key) {
  var value = obj[key];
   // do something with key or value
});

最佳实践是验证正在迭代的对象属性是否来自对象本身,而不是从原型链继承。您可以使用:(当然,如果您希望包含继承的属性,只需删除if语句)

一般情况如下:

for(var index in object) { 
   if (object.hasOwnProperty(index)) {
       var value = object[index];
       // do something with object value here.
   }
}
下面是您提到的示例案例,您希望创建一个复制对象,其中每个键的值根据var
numberofobjects
的值进行复制(我添加了两个解决方案,您可以修改现有对象或创建一个新对象):

//函数以字符串形式重复值,灵感来源于disfated的答案http://stackoverflow.com/questions/202605/repeat-string-javascript
函数重复值(值、计数){
value=String(value);//更改为String以便能够添加“>”如所述
如果(计数<1)返回“”;
var结果=“”;
而(计数>1){
如果(计数&1)结果+=值+“>”;
计数>>=1,值+=“>”+值;
}
返回结果+值;
}
var numberofobjects=3;
var newObject={};//用于创建具有新值的重复对象
对于(默认值中的var x){
if(默认值为hasOwnProperty(x)){
//使用此选项替换现有值
默认值[x]=repeatValue(默认值[x],numberofobjects);
//或者使用此选项在新对象中创建值
newObject[x]=repeatValue(默认值[x],numberofobjects);
}
}

在开始之前,让我们先设置基本对象:

const x = {
  x: 1,
  y: 2,
  z: 3
};
我们可以使用Object.keys(x)返回对象中所有键的数组

Object.keys(x)
> ['x', 'y', 'z']
现在,我们可以映射、过滤、减少和循环数组,并在对象中使用该值执行某些操作:

Object.keys(x).map(key => x[key] + 1)
> [2,3,4]

Object.keys(x).forEach(key => console.log(x[key]))
> [1,2,3]
这里的主要优点是我们必须使用密钥来访问特定的值,它可以工作,但感觉有点笨重。ES2017附带了
Object.values()
,它可以作为返回
对象中所有值的数组的快捷方式

Object.values(x)
> [1,2,3]

Object.values(x).map(value => value + 1)
> [2,3,4]

Object.values(x).forEach(value => console.log(value))
> [1,2,3]
您可以在上阅读更多关于Object.values()的信息,如果您需要支持旧浏览器和尚未实现它的浏览器,它们还包括一个polyfill

还有Object.entries(),它方便地允许您访问键和值。它返回一个包含数组的数组(第一项是键,第二项是值)

Object.entries(x);
> [['x', 1], ['y', 2], ['z', 3]]
我们可以使用去结构化来轻松获得这些值:

Object.entries(x).map(([key, value]) => console.log(key, value))
var变量={
波贝:23,
教皇:33,
末日:43,
毒品:53
};
for(变量中的var keyName){
write(keyName,“:”,变量[keyName],“”);

};
要迭代对象的值,可以使用循环

如果在迭代时需要键和值,可以使用

摘自:


好吧,我很困惑。如果我记录console.log(默认值[starts]),我将什么也得不到,但是如果我记录console.log(默认值[starts]),我将什么都得不到它拉动字符串。x只是一个替代变量,我需要通过默认值在循环内分配“开始”、“速度”等-因此我得到defaults.starts和defaults.speed等。我是否设置了默认值部分不正确?谢谢!点符号与属性的实际名称配合使用,因此在您的示例中
defaults.starts
之所以有效,是因为您的属性名是字符串“starts”。等效的括号表示法是
default[“starts”]
-请注意引号。方括号内的位应该是返回字符串的任何JS表达式,因此如果您说
defaults[starts]
正在寻找一个变量
start
,您没有该变量,因此返回未定义的。阅读此内容:如果需要支持IE小于9,也可以转到polyfill的链接。根据ESLint的AirBnB styleguide,这是(obj中的var键)优于
的首选方法
@Timo-原因是Object.keys查找它自己的所有可枚举属性。“for in”还查找继承的可枚举属性,而不仅仅是它自己的属性。此方法的问题是,您还应该检查属性是否属于对象本身而不是其原型。我建议使用@blair anderson solution with
Object.keys(obj)
@Kite虽然这个问题是真的,但这个问题是关于
对象文字的
这个解决方案缺少
对in的保护:-使用
Object.keys(obj).forEach(func)
是更好的解决方案(见Blair Anderson的帖子)@Timo根据上面的评论,这个问题是专门询问
对象文本
,而不是实例。@zero\u cool yes。根据我的示例Object.entries(x); > [['x', 1], ['y', 2], ['z', 3]]
Object.entries(x).map(([key, value]) => console.log(key, value))
const myObj = {a: 1, b: 2}

for (let value of Object.values(myObj)) {
    console.log(`value=${value}`)
}

// output: 
// value=1
// value=2
const myObj = {a: 1, b: 2}

for (let [key, value] of Object.entries(myObj)) {
    console.log(`key=${key} value=${value}`)
}

// output: 
// key=a value=1
// key=b value=2
const object1 = {
  a: 'somestring',
  b: 42,
  c: false
};

console.log(Object.values(object1));
// expected output: Array ["somestring", 42, false]