本质上,当在数组上应用zipWithIndex时,它应该生成另一个键为value且值作为array元素的数组(反之亦然)。

最佳答案

更新

根据OP的注释,返回值应该是一个对象数组,每个对象都包含一个属性,该属性是输入数组/对象的反向属性(即键和值交换位置)。

function invert(list) {
  return _.map(list, function(val, key) {
    var obj = {};
    obj[val] = key;
    return obj;
  });
}


示例1:['a', 'b', 'c'] ==> [{a:0}, {b:1}, {c:2}]

示例2:{key1:'a', key2:'b'} ==> [{a:'key1'}, {b:'key2'}]



function invert(list) {
  return _.map(list, function(val, key) {
    var obj = {};
    obj[val] = key;
    return obj;
  });
}


function doAlert(input) {
  alert (JSON.stringify(input) + ' ==> ' + JSON.stringify(invert(input)));
}

doAlert(['a', 'b', 'c']);
doAlert({key1: 'a', key2: 'b'});

<script src="http://underscorejs.org/underscore-min.js"></script>





就像Underscore.JS中的_.invert函数一样,这些值必须可序列化(即可转换为字符串),以使其具有可预测的行为。



原始答案

考虑:

function zipWithIndex(list) {
  return _.map(list, function(val, key) { return [val, key]; });
}


实际上,这应该同时适用于对象和数组(就_.map而言,可以迭代的任何对象)。

zipWithIndex的此实现基于Scala's implementation(使用此函数定义后,我可以找到的唯一广泛使用的语言)。



function zipWithIndex(list) {
  return _.map(list, function(val, key) { return [val, key]; });
}

function doAlert(input) {
  alert (JSON.stringify(input) + ' ==> ' + JSON.stringify(zipWithIndex(input)));
}

doAlert(['a', 'b', 'c']);
doAlert({key1: 'a', key2: 'b'});

<script src="http://underscorejs.org/underscore-min.js"></script>

09-26 10:57