将数组值设置为对象键

时间:2020-06-12 14:53:28

标签: javascript

我发现这段代码对数组中的重复元素进行计数

const a = ['first', 'first', 'second'];
const obj = {};
for (let i = 0; i < a.length; i++) {
    const current = a[i];
    if (obj[current]) {
        obj[current] += 1
    }else {
        obj[current] = 1
    }
}
console.log(obj)

我很难弄清楚这个if语句如何创建对象。我认为主要逻辑在这里:

 if (obj[current]) {
        obj[current] += 1
    }else {
        obj[current] = 1
 }

obj中的if语句chack if存在一个键,它将增加数字obj[current] += 1,但是此代码如何将数组中的值设置为键,因为obj[current]输出数字,而不是关键。代码如何设置对象的键?

3 个答案:

答案 0 :(得分:0)

如果数组a中的当前元素在obj中尚不存在,则其默认值为1。此粗略调用堆栈图可能会有所帮助

i |   a[i]   |    obj
0 | 'first'  | { first: 1 }
1 | 'first'  | { first: 2 }
2 | 'second' | { first: 2, second: 1 }

答案 1 :(得分:0)

var obj = {}

if (obj[current]) {
  obj[current] += 1;
} else {
  obj[current] = 1;
}

obj是一个字典结构,也称为associative array

字典键在常规编程中可以是任何类型。但是在javascript中,通常将字符串或数字类型用作字典键。您可以使用obj['key']在字典中获取或设置值。您还可以使用变量来表示字典键,例如:obj[current]

const obj = {}
const keyName = 'stack'
obj[keyName] = 'overflow';
console.log(obj); // { "stack": "overflow" }
obj['stack'] = 'exchange';
console.log(obj); // { "stack": "exchange" }

您提到的代码检查obj[current]值是否不是null0""undefinedfalse中的任何一个。如果字典中没有键,则Dictionary [key]返回undefined。

您也可以这样写:

if (obj[current] !== undefined)

因此if (obj[current])检查obj词典中的键是否等于current。如果键可用,则仅增加字典项的值。如果该键不可用,则会使用obj键和current值将新项目放到1字典中。

答案 2 :(得分:0)

我猜你在这行上误会了

obj [current]输出数字,而不是。代码如何设置密钥 一个对象?

因此,如果我在for中添加一个控制台,则您可以轻松地在基于obj[current]的每次迭代中查看i的值,当obj不返回时,它将返回 undefined 不包含密钥(根据您的if条件),并且密钥存在数字,即obj[current]不等于undefined0,{{1 }},false"",然后将其递增1。

null