Javascript 迭代对象文字值
我有一个标准的jQuery插件,可以在顶部创建默认设置:Javascript 迭代对象文字值,javascript,Javascript,我有一个标准的jQuery插件,可以在顶部创建默认设置: jQuery.fn.myPlugin = function(options) { var defaults = { starts: "0px,0px", speed: 250, ... }; o = $.extend(defaults, options); } 我还有另一个变量名为numberOfObjects 我试图循环使用默认变量。对于找到的每个对象(从numberOfO
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
});
for(var index in object) {
if (object.hasOwnProperty(index)) {
var value = object[index];
// do something with object value here.
}
}
下面是您提到的示例案例,您希望创建一个复制对象,其中每个键的值根据varnumberofobjects
的值进行复制(我添加了两个解决方案,您可以修改现有对象或创建一个新对象):
//函数以字符串形式重复值,灵感来源于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 withObject.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]