将 NaN 值替换为第一个键值



我有这个对象

{
"apple": {
"0": {
"2018-04-25 19:51:38": {
"x": "38.0",
"y": "23.0"
},
"2018-04-25 19:51:39": {
"x": "NaN",
"y": "NaN"
},
"2018-04-25 19:51:40": {
"x": "NaN",
"y": "NaN"
}
},
"5": {
"2018-04-25 19:51:38": {
"x": "50.0",
"y": "35.0"
},
"2018-04-25 19:51:39": {
"x": "50.0",
"y": "35.0"
},
"2018-04-25 19:51:40": {
"x": "NaN",
"y": "NaN"
},
"2018-04-25 19:51:41": {
"x": "NaN",
"y": "NaN"
},
},
"6": {
"2018-04-25 19:51:34": {
"x": "30.0",
"y": "15.0"
},
"2018-04-25 19:51:39": {
"x": "NaN",
"y": "NaN"
},
}
}
}

如您所见,苹果keys不是可连续的数字。 这些对象中的每一个都有不同的长度,因此具有键0的对象长度为 3,具有键5的对象具有长度 4,具有键6的对象具有长度 2。 现在,我希望键 x 和 y 的 NaN 值获得同一键的第一个时间戳的值。 所以,我想要的是:

{
"apple": {
"0": {
"2018-04-25 19:51:38": {
"x": "38.0",
"y": "23.0"
},
"2018-04-25 19:51:39": {
"x": "38.0", // <-- same value of the first element
"y": "23.0" // <-- same value of the first element
},
"2018-04-25 19:51:40": {
"x": "38.0", // <-- same value of the first element
"y": "23.0" // <-- same value of the first element
}
},
"5": {
"2018-04-25 19:51:38": {
"x": "50.0",
"y": "35.0"
},
"2018-04-25 19:51:39": {
"x": "50.0", 
"y": "35.0" 
},
"2018-04-25 19:51:40": {
"x": "50.0", // <-- same value of the first element
"y": "35.0" // <-- same value of the first element
},
"2018-04-25 19:51:41": {
"x": "50.0", // <-- same value of the first element
"y": "35.0" // <-- same value of the first element
},
},
"6": {
"2018-04-25 19:51:34": {
"x": "30.0",
"y": "15.0"
},
"2018-04-25 19:51:39": {
"x": "30.0", // <-- same value of the first element
"y": "15.0" // <-- same value of the first element
},
}
}
}

我不知道该怎么做:(

您可以将array#forEachObject.keys()一起使用,以循环访问对象的每个键。然后将第一个时间戳的xy的值存储在变量中,然后循环访问内部对象的每个键并更新值为NaN的所有键的值。

let data = { "apple": { "0": { "2018-04-25 19:51:38": { "x": "38.0", "y": "23.0" }, "2018-04-25 19:51:39": { "x": "NaN", "y": "NaN" }, "2018-04-25 19:51:40": { "x": "NaN", "y": "NaN" } }, "5": { "2018-04-25 19:51:38": { "x": "50.0", "y": "35.0" }, "2018-04-25 19:51:39": { "x": "50.0", "y": "35.0" }, "2018-04-25 19:51:40": { "x": "NaN", "y": "NaN" }, "2018-04-25 19:51:41": { "x": "NaN", "y": "NaN" }, }, "6": { "2018-04-25 19:51:34": { "x": "30.0", "y": "15.0" }, "2018-04-25 19:51:39": { "x": "NaN", "y": "NaN" }, } } };
Object.keys(data.apple).forEach(k => {
let x = 'NaN', y = 'NaN';
Object.keys(data.apple[k]).sort().forEach((k1,i) => {
if(i === 0) {
x = data.apple[k][k1].x;
y = data.apple[k][k1].y;
} else {
if(data.apple[k][k1].x === 'NaN')
data.apple[k][k1].x = x;
if(data.apple[k][k1].y === 'NaN')
data.apple[k][k1].y = y;
}
});
});
console.log(data);

let data = { "apple": { "0": { "2018-04-25 19:51:38": { "x": "38.0", "y": "23.0" }, "2018-04-25 19:51:39": { "x": "NaN", "y": "NaN" }, "2018-04-25 19:51:40": { "x": "NaN", "y": "NaN" } }, "5": { "2018-04-25 19:51:38": { "x": "50.0", "y": "35.0" }, "2018-04-25 19:51:39": { "x": "50.0", "y": "35.0" }, "2018-04-25 19:51:40": { "x": "NaN", "y": "NaN" }, "2018-04-25 19:51:41": { "x": "NaN", "y": "NaN" }, }, "6": { "2018-04-25 19:51:34": { "x": "30.0", "y": "15.0" }, "2018-04-25 19:51:39": { "x": "NaN", "y": "NaN" }, } } },
result = Object.keys(data.apple).reduce((r,k) => {
let x = 'NaN', y = 'NaN';
r.apple[k] = {};
Object.keys(data.apple[k]).sort().forEach((k1,i) => {
if(i === 0) {
r.apple[k][k1] = {...data.apple[k][k1]};
x = data.apple[k][k1].x;
y = data.apple[k][k1].y;
} else {
if(data.apple[k][k1].x === 'NaN')
r.apple[k][k1] = {x,y};
if(data.apple[k][k1].y === 'NaN')
r.apple[k][k1] = {x,y};
}
});
return r;
}, {apple : {}});
console.log(result);

Object.values()上使用Object.entries()Array#find()获取有效对象,然后Object.assign()更新所有NaN

let data = { "apple": { "0": { "2018-04-25 19:51:38": { "x": "38.0", "y": "23.0" }, "2018-04-25 19:51:39": { "x": "NaN", "y": "NaN" }, "2018-04-25 19:51:40": { "x": "NaN", "y": "NaN" } }, "5": { "2018-04-25 19:51:38": { "x": "50.0", "y": "35.0" }, "2018-04-25 19:51:39": { "x": "50.0", "y": "35.0" }, "2018-04-25 19:51:40": { "x": "NaN", "y": "NaN" }, "2018-04-25 19:51:41": { "x": "NaN", "y": "NaN" }, }, "6": { "2018-04-25 19:51:34": { "x": "30.0", "y": "15.0" }, "2018-04-25 19:51:39": { "x": "NaN", "y": "NaN" }, } } };
Object.entries(data.apple).forEach(([k,v]) => {
const valid = Object.values(v).find(({x,y})=> x !=='NaN' && y !=='NaN');
Object.entries(v).filter(([_,{x,y}])=> x==='NaN' && y==='NaN')
.forEach(([k,v])=>Object.assign(v, valid))

});
console.log(data);
.as-console-wrapper {max-height: 100%!important;}

Native for 比 foreach 更快。 不变的方式是另一个问题..必须在另一个问题中分开...然而。。我试探你的要求... 和嗖..没关系...尝试使用代码 Adobe ...克隆对象(不可变方式)


var hola = {"apple":{"0":{"2018-04-25 19:51:38":{"x":"38.0","y":"23.0"},"2018-04-25 19:51:39":{"x":"NaN","y":"NaN"},"2018-04-25 19:51:40":{"x":"NaN","y":"NaN"}},"5":{"2018-04-25 19:51:38":{"x":"50.0","y":"35.0"},"2018-04-25 19:51:39":{"x":"50.0","y":"35.0"},"2018-04-25 19:51:40":{"x":"NaN","y":"NaN"},"2018-04-25 19:51:41":{"x":"NaN","y":"NaN"}},"6":{"2018-04-25 19:51:34":{"x":"30.0","y":"15.0"},"2018-04-25 19:51:39":{"x":"NaN","y":"NaN"}}}}

var original_var = clone(hola);
for ( property in hola.apple ) {

var property_sub = property 
property_sub_keys = Object.keys( hola.apple[property_sub] );
//console.log( property_sub_keys )

for ( var i=0; i<property_sub_keys.length; i++){
if (i==0) {
x_ini = hola.apple[property_sub][property_sub_keys[i]].x
y_ini = hola.apple[property_sub][property_sub_keys[i]].y
}else{
if ( hola.apple[property_sub][property_sub_keys[i]].x == "NaN" ){
hola.apple[property_sub][property_sub_keys[i]].x = x_ini
}
if ( hola.apple[property_sub][property_sub_keys[i]].y == "NaN" ){
hola.apple[property_sub][property_sub_keys[i]].y = y_ini
}
}

} 


}
function clone(obj) {
var copy;
// Handle the 3 simple types, and null or undefined
if (null == obj || "object" != typeof obj) return obj;
// Handle Date
if (obj instanceof Date) {
copy = new Date();
copy.setTime(obj.getTime());
return copy;
}
// Handle Array
if (obj instanceof Array) {
copy = [];
for (var i = 0, len = obj.length; i < len; i++) {
copy[i] = clone(obj[i]);
}
return copy;
}
// Handle Object
if (obj instanceof Object) {
copy = {};
for (var attr in obj) {
if (obj.hasOwnProperty(attr)) copy[attr] = clone(obj[attr]);
}
return copy;
}
throw new Error("Unable to copy obj! Its type isn't supported.");
}
console.log(hola)
console.log(original_var)
<script src="https://getfirebug.com/firebug-lite-debug.js"></script>

最新更新