我在创建一个程序时遇到了很大困难,该程序根据我设置的规则检查数组中对象的出现次数。如果特定对象存在多于一个,我会计算出现次数。
示例输入:
[
'{"NAME1":{"12":{"10":1}}}',
'{"NAME1":{"12":{"10":1}}}',
'{"NAME1":{"12":{"10":1}}}'
]
示例输出:
[
'{"NAME1":{"12":{"10":3}}}'
]
警告:这是一个例子。
那么,我是怎么做的:
let SUPER = [
{"NAME1":{"12":{"10":1}}},
{"NAME1":{"12":{"10":1}}},
{"NAME1":{"12":{"10":1}}},
{"NAME1":{"12":{"10":1}}}
],
FINAL = [];
for (let _super of SUPER) {
_super = JSON.stringify(_super);
let ii = 0, ll = SUPER.length, number = 0;
for (ii; ii < ll; ii++) {
let current = JSON.stringify(SUPER[ii]);
if (_super === current) {
SUPER.splice(ii, 1);
number++;
}
}
if (number) {
FINAL.push(function clone(destination, source) {
destination = destination || {};
for (var prop in source) {
typeof source[prop] === 'object' && source[prop] !== null && source[prop]
? destination[prop] = clone({}, source[prop])
: destination[prop] = number
;
}
return destination;
}({}, JSON.parse(_super)));
}
}
document.body.innerHTML = JSON.stringify(FINAL, null, 4);
所以,我循环遍历SUPER两次,一个在另一个内部来测试每个对象,如果我找到相同的字符串,我将数字增加一个并从数组中删除对象,然后我使用这个脚本将数字分配给对象的最内层属性:
if (number) {
FINAL.push(function clone(destination, source) {
destination = destination || {};
for (var prop in source) {
typeof source[prop] === 'object' && source[prop] !== null && source[prop]
? destination[prop] = clone({}, source[prop])
: destination[prop] = number
;
}
return destination;
}({}, JSON.parse(_super)));
}
但由于这一行存在冲突,因此无法正常工作:
if (_super === current) {
SUPER.splice(ii, 1);
number++;
}
我弄乱了循环。任何想法如何解决?我愿意接受建议,我不知道是否有更好的方法来实现这一点,我希望有人知道。
感谢。
答案 0 :(得分:0)
拼接数组时,元素向左移动1,但循环索引继续向前移动而不考虑此移位。您可以通过每次拼接时将当前循环索引减1来解释它。
e.g: t = [1,2,3,4];
的console.log(T [1]); //输出:2
//拼接时
t.splice(1,1);
//拼接后,数组元素被移位
的console.log(T [1]); //输出:3
工作解决方案:
let SUPER = [{
"NAME1": {
"12": {
"10": 1
}
}
}, {
"NAME1": {
"12": {
"10": 1
}
}
}, {
"NAME1": {
"12": {
"10": 1
}
}
}, {
"NAME1": {
"12": {
"10": 1
}
}
}],
FINAL = [];
for (let i = 0; i < SUPER.length; i++) {
let _super = JSON.stringify(SUPER[i]),
ii = i + 1,
ll = SUPER.length,
number = 1;
for (ii; ii < ll; ii++) {
let current = JSON.stringify(SUPER[ii]);
if (_super === current) {
SUPER.splice(ii, 1);
ii--;
number++;
}
}
if (number) {
FINAL.push(function clone(destination, source) {
destination = destination || {};
for (var prop in source) {
typeof source[prop] === 'object' && source[prop] !== null && source[prop] ? destination[prop] = clone({}, source[prop]) : destination[prop] = number;
}
return destination;
}({}, JSON.parse(_super)));
}
}
document.body.innerHTML = JSON.stringify(FINAL, null, 4);
我还初始化了ii,数字为1以减少内循环的一次迭代。
答案 1 :(得分:0)
尝试编写自己的equals函数,并找到数组中出现的函数。
答案 2 :(得分:0)
如果您是动态设置&#34;通过两种Object方法的发明,改变规则然后执行这项工作非常容易;即Object.prototype.getNestedValue()
和Object.prototype.setNestedValue()
。我们开始做吧。两种方法都采用了许多参数,这些参数是对象属性(如果参数是"string"
类型)或数组索引(如果参数是"number"
类型)。除此之外,在Object.setNestedValues()
中,最后一个参数是要设置的值。简单。
所以这就是这样;
Object.prototype.getNestedValue = function(...a) {
return a.length > 1 ? (this[a[0]] !== void 0 && this[a[0]].getNestedValue(...a.slice(1))) : this[a[0]];
};
Object.prototype.setNestedValue = function(...a) {
return a.length > 2 ? typeof this[a[0]] === "object" && this[a[0]] !== null ? this[a[0]].setNestedValue(...a.slice(1))
: (this[a[0]] = typeof a[1] === "string" ? {} : new Array(a[1]),
this[a[0]].setNestedValue(...a.slice(1)))
: this[a[0]] = a[1];
};
var data = [
'{"NAME1":{"12":{"10":1}}}',
'{"NAME1":{"12":{"10":1}}}',
'{"NAME1":{"12":{"10":1}}}'
],
props = ["NAME1", "12", "10"], // this array is constructed dynamically !!
reduced = [data.reduce((p,c) => {var v = p.getNestedValue(...props);
p.setNestedValue(...props, !!v ? ++v : 1);
return p;},{})];
console.log(JSON.stringify(reduced,null,2));
&#13;