【问题标题】:Iterate over values of object迭代对象的值
【发布时间】:2016-03-01 00:25:00
【问题描述】:

我想遍历地图的所有值。 我知道iterate over all keys 是可能的。 但是是否可以直接迭代这些值?

 var map = { key1 : 'value1', key2 : 'value2' }
 for (var key in map) { ...} // iterates over keys

【问题讨论】:

  • 这个问题太常见了,我不知道以前没有人问过。但是我在stackoverflow上找不到这样的问题。
  • 迭代 kvp。不仅仅是键,您可以在迭代中访问键值或两者。 Map[key] 将是迭代的值
  • @kcbeard - 你能用一些证明/规范来支持你的主张(U iterate kvp's)吗?
  • @amit 为什么你有钥匙却没有访问权限?可能没有直接访问它们的方法,但您可以迭代键和关联值并执行此操作。因此,您实际上是在迭代两者。
  • @kcbeard - 这是完全错误的。您只能迭代键,这允许您访问值 - 如果您愿意,但您也可以根本不访问值(例如,如果您想列出键)。

标签: javascript dictionary


【解决方案1】:

这不是地图。这只是一个Object

编辑: 正如 Amit 在 cmets 中指出的那样,下面的代码比 OP 的差。

您可以通过实际迭代 来“迭代值”:

var value;
Object.keys(map).forEach(function(key) {
    value = map[key];
    console.log(value);
});

【讨论】:

  • @Matthias 一开始可能看起来不是这样,但是当您考虑一个重要点时,它完全有道理:对象中属性的顺序不是强制的。例如如果你说{a: 1, b: 2, c: 3} 和for 循环或通过Object.keys,你实际上并不能保证去1、2、3,所以直接循环值没有多大意义。 for ... in(和 Object.keys)更接近一个循环,它只是说“虽然还有属性,但获取另一个属性”。 keys 为您提供了一个强制排序的地方,例如Object.keys(myobj).sort().forEach(x => console.log(x)
  • 我看不出这比 OP 的 for(var key in map) {map[key]} 更好。它更长,可读性更低,浪费内存,执行速度更慢 - 有什么理由这样做吗?
  • @Amit 没有。我承认我没有注意他的例子。
  • 我还会提供一个实际的Map 用法示例。
【解决方案2】:

我这样迭代,它对我有用。

for (let [k, v] of myMap) {
    console.log("Key: " + k);
    console.log("Value: " + v);
}

希望这会有所帮助:)

【讨论】:

  • 我创建了var myMap = { key1 : 'value1', key2 : 'value2' },尝试使用您的代码并得到错误:TypeError: myMap is not iterable。对我来说唯一的方法是使用Object.entries(myMap) 就像@dmigo 一样。也许您以其他方式创建地图?
【解决方案3】:

从某种意义上说,我认为您打算在 ES5 或 ES2015 中,不,不是没有您的一些工作。

在 ES2016 中,可能是 object.values

请注意,JavaScript 中的数组实际上是从整数到值的映射,并且 JavaScript 数组中的值可以直接枚举。

['foo', 'bar'].forEach(v => console.log(v)); // foo bar

此外,在 ES2015 中,您可以通过将函数放在名称为 Symbol.iterator 的属性上来使对象可迭代:

var obj = { 
    foo: '1', 
    bar: '2',
    bam: '3',
    bat: '4',
};

obj[Symbol.iterator] = iter.bind(null, obj);

function* iter(o) {
    var keys = Object.keys(o);
    for (var i=0; i<keys.length; i++) {
        yield o[keys[i]];
    }
}

for(var v of obj) { console.log(v); } // '1', '2', '3', '4'

此外,根据其他答案,还有其他内置函数可以提供您想要的功能,例如 Map(但 不是 WeakMap 因为它不可迭代)和 Set示例(但这些尚未出现在所有浏览器中)。

【讨论】:

    【解决方案4】:

    EcmaScript 2017 引入了Object.entries,允许您迭代值和键。 Documentation

    var map = { key1 : 'value1', key2 : 'value2' }
    
    for (let [key, value] of Object.entries(map)) {
        console.log(`${key}: ${value}`);
    }
    

    结果将是:

    键1:值1
    键2:值2

    【讨论】:

      【解决方案5】:

      不,没有直接的方法可以对对象执行此操作。

      Map 类型确实有一个 values() 方法,该方法返回值的迭代器

      【讨论】:

        【解决方案6】:

        如果您想为每个 键和值深度迭代到一个复杂(嵌套)对象,您可以使用Object.keys()

        const iterate = (obj) => {
            Object.keys(obj).forEach(key => {
        
            console.log(`key: ${key}, value: ${obj[key]}`)
        
            if (typeof obj[key] === 'object') {
                    iterate(obj[key])
                }
            })
        }
        

        【讨论】:

          【解决方案7】:

          任何遇到这个问题的人,我通过执行以下操作在 njs ( nginx js ) 中解决了这个问题:

          >> var map = { key1 : 'value1', key2 : 'value2' }
          >> for ( var i in map ){ console.log(i, map[i]) }
          key1 value1
          key2 value2
          

          【讨论】:

            【解决方案8】:

            你可以使用underscore.js and the each function:

            _.each({key1: "value1", key2: "value2"}, function(value) {
              console.log(value);
            });
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2012-03-10
              • 1970-01-01
              • 2022-07-14
              • 2019-06-03
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2017-10-25
              相关资源
              最近更新 更多