JavaScript Finding/Comparing 并更新 metric/multi 维度数组的重复元素
JavaScript Finding/Comparing and updating duplicate elements of metric/multi dimension array
我有一个 metric/multi 维度数组,如下所示
[
[a,b,c,d],
[d,a,c,b],
[a,d,b,a],
[c,c,d,a]
]
我需要更新我给定的指标并以这种方式跟踪变化
一个元素只能在一列中重复。
如果一个元素出现在一个列中,则该元素不能出现在其他列中。
如果出现上述情况,通过将列索引附加到列中所有出现的元素来更新元素。
在上面的示例中,索引 [1][1](第 2 行和第 2 列中的 'a')的元素出现在第 1 列中。它及其所有出现应更新为 'a1' .同样,'d' 和 'c' 应该分别更新为 'd1' 和 'c1'。
在下一列第 3 列中,第 3 列中的 'c'、'b'、'd' 应更新为 'c2'、'b2'、'd2',因为 'b' 发生在第 2 列,类似地 'c' 和 'd' 之前发生过。
在下一列中,第 4 列 'd'、'b'、'a' 将更新为 'd4'、'b4'、'a4'.
结果指标将类似于
[
[a,b, c3,d4],
[d,a2,c3,b4],
[a,d2,b3,a4],
[c,c2,d3,a4]
]
跟踪部分
我们可以像
一样跟踪
var dictionary = [{"updatedValue":"originalValue"},...]
var dictionary = [{"a2":"a"},{"d2","d"},{"c2","c"},{"c3":"c"},{"b3":"b"},{"d3":"d"},{"d4","d"},{"a4":"a"},{"b4","b"}];
到目前为止我已经试过了
var flatData = [
['a', 'b', 'c', 'd'],
['d', 'a', 'c', 'b'],
['a', 'd', 'b', 'a'],
['c', 'c', 'd', 'a'],
];
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', 'c', 'b'],
['a', 'd', 'b', 'a'],
['c', 'c', 'd', '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;
}
我有一个 metric/multi 维度数组,如下所示
[
[a,b,c,d],
[d,a,c,b],
[a,d,b,a],
[c,c,d,a]
]
我需要更新我给定的指标并以这种方式跟踪变化
一个元素只能在一列中重复。
如果一个元素出现在一个列中,则该元素不能出现在其他列中。
如果出现上述情况,通过将列索引附加到列中所有出现的元素来更新元素。
在上面的示例中,索引 [1][1](第 2 行和第 2 列中的 'a')的元素出现在第 1 列中。它及其所有出现应更新为 'a1' .同样,'d' 和 'c' 应该分别更新为 'd1' 和 'c1'。
在下一列第 3 列中,第 3 列中的 'c'、'b'、'd' 应更新为 'c2'、'b2'、'd2',因为 'b' 发生在第 2 列,类似地 'c' 和 'd' 之前发生过。
在下一列中,第 4 列 'd'、'b'、'a' 将更新为 'd4'、'b4'、'a4'.
结果指标将类似于
[
[a,b, c3,d4],
[d,a2,c3,b4],
[a,d2,b3,a4],
[c,c2,d3,a4]
]
跟踪部分 我们可以像
一样跟踪var dictionary = [{"updatedValue":"originalValue"},...]
var dictionary = [{"a2":"a"},{"d2","d"},{"c2","c"},{"c3":"c"},{"b3":"b"},{"d3":"d"},{"d4","d"},{"a4":"a"},{"b4","b"}];
到目前为止我已经试过了
var flatData = [
['a', 'b', 'c', 'd'],
['d', 'a', 'c', 'b'],
['a', 'd', 'b', 'a'],
['c', 'c', 'd', 'a'],
];
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', 'c', 'b'],
['a', 'd', 'b', 'a'],
['c', 'c', 'd', '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;
}