【问题标题】:Javascript Avoid getting null after deleting objects from arrayJavascript避免从数组中删除对象后获取null
【发布时间】:2019-09-10 18:58:03
【问题描述】:

我有一个包含多个嵌套数组的数组。每个嵌套数组都有三个对象。我正在尝试删除第二个,但目前,我得到了一个空值。我想要的只是最终输出(之后)没有空值。 Splice 正在返回一个错误,即 splice 函数不存在。

var json_data=[[{value:"value1",formattedValue:"value1"},{value:"Unwanted part 3",formattedValue:"Unwanted part 3"},{value:2831.8,formattedValue:"283,180.00 %"}],[{value:"value1",formattedValue:"value1"},{value:"Unwanted part 2",formattedValue:"Unwanted part 2"},{value:349.1111111111111,formattedValue:"34,911.11 %"}],[{value:"value2",formattedValue:"value2"},{value:"Unwanted part 1",formattedValue:"Unwanted part 1"},{value:3.3703703703703702,formattedValue:"337.04 %"}]];

document.getElementById("before").innerHTML= JSON.stringify(json_data); 

for(i=0;i<json_data.length;i++){
  let items = json_data[i];
  const subItemToBeRemovedId = 1;
  items.forEach((item) => items.forEach((subItem, index) => {
      //console.log(JSON.stringify(items[subItemToBeRemovedId]));
      delete items[subItemToBeRemovedId];
      //return item.subItemToBeRemovedId.splice(index, 1);
  }));
}

document.getElementById("after").innerHTML= JSON.stringify(json_data); 
<h1>before</h1>
<div id="before"></div>
<h1>after </h1>
<div id="after"></div>

【问题讨论】:

  • 为什么不使用 .splice?
  • 关于重复项的接受答案详细说明了为什么 delete 不起作用,以及为什么 splice 会起作用。
  • @HereticMonkey 我试过拼接。我的代码已将其注释掉,因为它不起作用。
  • Splice() 工作完美,看看我的回答。 @ApoloRadomer

标签: javascript object


【解决方案1】:

您可以使用以下代码,
在这里,您可以简单地使用 .splice() 从数组中删除元素。不需要使用多个forEach()

var json_data = [
  [{
    value: "value1",
    formattedValue: "value1"
  }, {
    value: "Unwanted part 3",
    formattedValue: "Unwanted part 3"
  }, {
    value: 2831.8,
    formattedValue: "283,180.00 %"
  }],
  [{
    value: "value1",
    formattedValue: "value1"
  }, {
    value: "Unwanted part 2",
    formattedValue: "Unwanted part 2"
  }, {
    value: 349.1111111111111,
    formattedValue: "34,911.11 %"
  }],
  [{
    value: "value2",
    formattedValue: "value2"
  }, {
    value: "Unwanted part 1",
    formattedValue: "Unwanted part 1"
  }, {
    value: 3.3703703703703702,
    formattedValue: "337.04 %"
  }]
];

document.getElementById("before").innerHTML = JSON.stringify(json_data);

for (i = 0; i < json_data.length; i++) {
  let items = json_data[i];
  console.log("ITEMS  ===>", items);
  items.splice(1, 1);
}

document.getElementById("after").innerHTML = JSON.stringify(json_data);
<h1>before</h1>
<div id="before"></div>
<h1>after </h1>
<div id="after"></div>

这是您正在寻找的解决方案。

【讨论】:

  • 与仅在代码块中给出答案的答案相比,解释其代码的答案被赞成的频率更高,而被反对的频率更低。
【解决方案2】:

delete 在这种情况下不会做你想做的事,它总是会用空位置替换数组条目,因为我相信它会像处理对象一样处理数组(所以你的长度属性也不会更新)。

我相信你几乎把它放在了你的注释部分。而不是:

 return item.subItemToBeRemovedId.splice(index, 1);

使用:

items.splice(subItemToBeRemovedId, 1);
return items;

Splice 会改变你的数组,然后你可以返回。

【讨论】:

    【解决方案3】:

    你可以在回调函数中使用mapsplice

    json_data = json_data.map(subArr => {
        subArr.splice(1,1);
        return subArr
    })
    

    【讨论】:

    • .map() 函数不返回对象。您应该改用.filter()
    • 谁告诉你他需要一个对象?
    • 你在这里写了return,因此我只是在纠正你@Daniyal
    【解决方案4】:

    您可以使用Array.prototype.map 来获取内部数组,然后根据位置对其进行过滤:

    const json_data=[[{value:"value1",formattedValue:"value1"},{value:"Unwanted part 3",formattedValue:"Unwanted part 3"},{value:2831.8,formattedValue:"283,180.00 %"}],[{value:"value1",formattedValue:"value1"},{value:"Unwanted part 2",formattedValue:"Unwanted part 2"},{value:349.1111111111111,formattedValue:"34,911.11 %"}],[{value:"value2",formattedValue:"value2"},{value:"Unwanted part 1",formattedValue:"Unwanted part 1"},{value:3.3703703703703702,formattedValue:"337.04 %"}]];
    
    document.getElementById("before").innerHTML= JSON.stringify(json_data); 
    
    const after_json_data = json_data.map(items => 
                                items.filter((item, idx) => idx !== 1))
    
    
    document.getElementById("after").innerHTML= JSON.stringify(after_json_data);
    <h1>before</h1>
    <div id="before"></div>
    <h1>after </h1>
    <div id="after"></div>

    使用delete 运算符删除数组元素不会改变数组的length,而是用undefined 代替已删除的元素。

    对于一个实验,让我们从下面的数组中删除第二个元素:

    const arr = ["foo", "baz", "bar"];
    delete arr[1];
    console.log(arr);

    索引1 变为undefined。但是您会在输出中看到 null 而不是 undefined 这是因为当您将数组对象转换为 JSON 时,undefined 会转换为 null,因为 JSON 规范中没有 undefined

    const arr = ["foo", "baz", "bar"];
    delete arr[1];
    console.log(arr);
    // undefined is null in the JSON string
    console.log(JSON.stringify(arr));

    【讨论】:

      猜你喜欢
      • 2016-05-19
      • 2020-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-21
      • 2012-04-18
      • 2012-06-17
      相关资源
      最近更新 更多