问题描述
[
[a,b,c,d],[d,a,b],[a,d,a],[c,a]
]
我需要更新给定的指标并以这种方式跟踪更改
-
一个元素只能在一列中重复。
-
如果元素出现在其他列中,则该元素不能出现在其他列中。
-
如果发生上述情况,请通过将列索引附加到列中所有出现的元素来更新元素。
在上面的示例中,索引[1] [1](第2行和第2列中的'a')元素已出现在第1列中。它的所有出现都应更新为'a1'。同样,“ d”和“ c”应分别更新为“ d1”和“ c1”。
在下一列的第3列中,第3列中的“ c”,“ b”,“ d”应更新为“ c2”,“ b2”,“ d2”,因为在第2列中出现了“ b”,类似的是“ c”和'd'已经发生过。
在下一列的第4列'd','b','a'将更新为'd4','b4','a4'。
结果指标如下
[
[a,c3,d4],a2,b4],d2,b3,a4],c2,d3,a4]
]
保持轨道部分 我们可以像这样
var dictionary = [{"updatedValue":"originalValue"},...]
var dictionary = [{"a2":"a"},{"d2","d"},{"c2","c"},{"c3":"c"},{"b3":"b"},{"d3":"d"},{"d4",{"a4":"a"},{"b4","b"}];
到目前为止,我已经尝试过了
var flatData = [
['a','b','c','d'],['d','a','b'],['a','d','a'],['c',];
for (var i = 0; i < flatData.length; i++) {
for (var j = 0; j < flatData[i].length; j++) {
var element = flatData[i][j];
for (var k = 0; k < flatData.length; k++) {
for (var l = 0; l < flatData[k].length; L++) {
if (j != l) {
if (element == flatData[k][l]) {
flatData[k][l] = flatData[k][l] + l;
}
}
}
}
}
}
console.log(JSON.stringify(flatData));
解决方法
解决方案使用Map(也可以是普通对象),其中第一次遇到值时,将创建一个新的条目,该条目具有对象{col: firstColIndexFound,count:0}
。
下次遇到相同的值时,它将检查存储的列索引,如果不同则更新计数并创建一个新值
const data = [
['a','b','c','d'],['d','a','b'],['a','d','a'],['c','a']
];
const dict = {};
const map = new Map();
for (let c = 0; c < data[0].length; c++) { // c for colIndex
for (let r = 0; r < data.length; r++) { // r for rowIndex
const el = data[r][c];
if (!map.has(el)) {
// first time found create new entry
map.set(el,{col: c,count: 0});
}
const entry = map.get(el);
// if column index different than first column found update value
if (c !== entry.col) {
entry.count++;
const nVal = el + entry.count;
dict[nVal] = el;
data[r][c] = nVal;
}
}
}
console.log(JSON.stringify(data))
console.log(dict)
.as-console-wrapper {
max-height: 100%!important;
top: 0;
}