如何在underscore.js中实现`zipWithIndex`?

时间:2015-06-19 23:40:39

标签: javascript underscore.js

基本上当zipWithIndex应用于数组时,它应该生成另一个数组,其键值为value,值为数组元素(反之亦然)。

1 个答案:

答案 0 :(得分:1)

<强>更新

根据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>