我在查询“如何对一个对象数组去重复”的时候,见到了这样的代码
我想问的是,result是一个对象,song某一位的name是一个字符串,为什么写 result[songs[i].name]=songs[i];这样的语句可以在result对象里面添加一个属性。
以下是原文地址
https://www.jianshu.com/p/131ca13e7f28
方便你知道属性名(的字符串)去访问一个属性啊
比如
str = "name"
我要访问
user.name
这里name不写死,而是通过str传过来
怎么写,
用user.(str)???这么写很奇怪吧,那就 user[str]了。
lz等你见的多了就见怪不怪了。
c++语言里还有更变态的。
int a[3];
2[a] = 1;
这么写见过么?还真的能给 a[2]赋值,哈哈哈,而且似乎没有什么实际用途。
你可以这么理解。var result = {};当你给result添加属性和值的方式有两种,1.result.XX = MM;2.result[xx] =mm;第二种的[xx]用于变量,就是非字面量;兄弟,你的基础比较薄弱,推荐你看javascript精髓,javascript权威巩固基础
result是一个对象,注意{ } 大括号,表示定义一个对象,大部分情况下要有成对的属性和值,或是函数。
如:var LangShen = {"Name":"Langshen","AGE":"28"};
songs是一个数组,songs[i]是一个对象,
,result[songs[i].name]=songs[i];相当于组合一个{songs[i].name:song[i]}的对象
javascript中,一切皆是对象,
javascript访问属性有两种方法:
第一,通过 . 来访问,
第二种是通过 [] 来访问, 规定当key为数字或变量的时候,就必须用 [] 来访问(数组其实也是对象, 比如你访问数组成员就是通过arr[0], arr[1] .... arr.length),
在 result[ songs[i].name ] = songs[i] 中, songs[i].name就相当于一个变量, 这里又涉及到运算的优先级, 所以会先得到 songs[i].name的值,
假设 i = 0, 那么 result[ songs[i].name ] = songs[i] 就相当于 result['羽根'] = songs[1], 所以result中就添加了'羽根'这样的属性,但是建议不要用中文作为key值
result是一个对象。设置对象的属性有两种方式,
第一种是 result.abc 这种方式属性名只能是在代码中固定写好的,不能动态改变。
第二种是 result["abc"] 其中的属性名"abc"是一个字符串表达式,既然是表达式就可以动态的获取和改变。
比如result["abc"]中"abc"是字符串常量,也可以改用变量。如等同下面:
var n = "abc";
result[n]
而result[songs[i].name]=songs[i];中songs[i].name的值就是一个字符串,这就相当于一个变量,可以用这个字符串作为result对象的属性名。
代码改成下面这样会好理解一些
var n = songs[i].name;
result[n]=songs[i];
有必要给你解释下:for(var item : items),如果items是数组,那么item则是数组的下标,如果items是对象,则item是对象的属性,
如果items是对象,items【item】不能理解为数组引用,而是取items对象的item属性的值。js为什么要这么设计?
对于一个对象a ={“v”: “1”, "b.c" : 2};要得到属性v的值可以a.v或a["v"],但要得到属性b.c的值只能用a["b.c"]因为如果你用a.b.c去引用会有歧义。
所以你懂的
JavaScript 对象取值有两种方法:
// 第一种: 点语法
var obj = {name: 'ming'};
console.log(obj.name);
// 第二种: 中括号
console.log(obj['name'])
你理解一下 中括号里面包含的是一个key(键名, 类型是字符串, 这里的key 叫 name)
当我们不确定要取的对象的某个key时, 中括号写法是最合适的
下面用for in 循环展示 如何使用动态 key
var obj = {a:1,b:2,c:3};
for(var key in obj){
console.log(key);
console.log(obj[key]);
}
再回到你的代码里:
songs[i].name 对应着每个 song 的 name 属性, 代码解释就是 将这个属性作为去重对象的键名,
例如 result[song[0].name]: result['羽根']
JavaScript对象键名可以是中文, 只是不太推荐
这样可以理解吗?