添加修饰符以复制Lodash.js中的元素?

时间:2015-05-25 05:05:52

标签: javascript jquery underscore.js lodash

输入将是一个包含重复元素的列表,如下所示:

['30','10','10','20','20','30']

输出将是一个包含修改过的元素的列表:

['30#1', '10#1', '10#2', '20#1', '20#2', '30#2']

#修饰符指示此元素在列表中显示的时间..

有没有人有这方面的想法?

3 个答案:

答案 0 :(得分:2)

所以你希望结果是一个数组,其中的项目对应于原始数组中的每个项目。这是Array.prototype.map的工作。您希望保持每个项目出现次数的运行计数,您可以使用一个简单的对象。在每次迭代中,您都会查找项目出现的次数并添加一项。将该数字存储为新计数并使用它来建立您的返回值。像这样,或多或少:

var arr = ['30', '10', '10', '20', '20', '30'];
var counts = {};

var arr2 = arr.map(function(item) {
  counts[item] = (counts[item] || 0) + 1;
  return item + "#" + counts[item];
});

你根本不需要Lodash。

答案 1 :(得分:1)

这是一个使用lodash的例子。

_.map(coll, function(item) {
    return item + '#' +
        _.set(this, item, _.get(this, item, 0) + 1)[item];
}, {});

您不需要在此处设置临时变量来计算结果,这真是太好了。我们的想法是将它们存储在this中 - 传递给map()的空对象。

如果属性不存在,get()函数会为您提供0默认值。所以这可以直接用set()来设置属性值,然后返回对象。

答案 2 :(得分:0)

示例:

var count = {};
['30','10','10','20','20','30'].map(function(current) {
    count[current] ? count[current] +=1 : count[current] = 1;
    return current + '#' + count[current];
})