Javascript 用第一个键值替换NaN值

Javascript 用第一个键值替换NaN值,javascript,json,Javascript,Json,我有这个东西 { "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",

我有这个东西

{
  "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"
      },
    }
  }
}
正如您所看到的,apple
键是不可排序的数字。
每个对象都有不同的长度,因此键为
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
      },
    }
  }
}
{
“苹果”:{
"0": {
"2018-04-25 19:51:38": {
“x”:“38.0”,
“y”:“23.0”
},
"2018-04-25 19:51:39": {
“x”:“38.0”,//您可以将
array#forEach
Object.keys()一起使用
迭代对象的每个键。然后在变量中存储第一个时间戳的
x
y
值,然后迭代内部对象的每个键,并更新值为
NaN
的所有键的值

let data={“苹果”:{“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”:“NaN”},“y”:“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=>{
设x='NaN',y='NaN';
Object.keys(data.apple[k]).sort().forEach((k1,i)=>{
如果(i==0){
x=data.apple[k][k1].x;
y=data.apple[k][k1].y;
}否则{
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(数据);
Native for比foreach更快。。。。 无法改变的方式是另一个问题…必须在另一个问题中分开…然而…我试图满足你的要求。。。 whoola..没问题…请尝试adobe的代码…克隆一个对象(以可变方式)


)3.0,“y“,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,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=克隆(hola);
对于(hola.apple中的财产){
var property\u sub=属性
property_sub_keys=Object.keys(hola.apple[property_sub]);
//console.log(属性\子\键)
对于(var i=0;i使用
Object.entries()
Array\find()
Object.values()
上获取有效对象,然后
Object.assign()
更新所有
NaN

let data={“苹果”:{“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”:“NaN”},“y”:“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(([[ux,{x,y}])=>x=='NaN'&&y=='NaN')
.forEach(([k,v])=>Object.assign(v,valid))
});
console.log(数据);

。作为控制台包装{最大高度:100%!重要;}
你必须循环数据并填补空白。到目前为止你尝试过的任何东西吗?
0
5
6
应该是数组吗?对象属性的顺序没有保证-你可以自己拆分这些键并对它们进行排序以绕过这个问题。在foreach之前进行排序是一个好的补充吗ion?
Object.keys(data.apple).sort().forEach(…
可能必须覆盖默认排序-js可能无法处理这些字符串日期我的意思是日期键
2018-04-25 19:51:40
,诸如此类-可能可以像这样正常工作+1@HassanImam谢谢,但是有可能以不变的方式这样做吗?我不会更改原始对象,我更喜欢返回一个新对象。@beth Updated解决方案。谢谢,但是可以用不可变的方式吗?我不会更改原始对象,我更喜欢返回一个新对象。谢谢,但是可以用不可变的方式吗?我不会更改原始对象,我更喜欢返回一个新对象。javascript方式不是克隆对象的更好方式…也许在服务器端是最佳选择..但是预期结果已完成..请检查!