本质上,当在数组上应用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>