【问题标题】:Inserting data at a specified index在指定索引处插入数据
【发布时间】:2022-01-05 05:26:55
【问题描述】:

这个想法是在用户提供的特定索引处插入数据。我熟悉数组插入方法,但不知道如何获取用户提供的数据索引以便能够在该点插入数据。我的计划是首先根据输入过滤数据,然后使用该精确索引来使用拼接方法。我确实过滤了数据,但没有超出这个范围。任何帮助,将不胜感激。 JSON和代码如下:

JSON

[
    {
        "district": "Kolkata",
        "ward_no": [
            {
                "ward": "6",
                "grievance": [
                    {
                        "serial_number": "0001",
                        "name" : "Mr.A"
                    },
                    {
                        "serial_number": "0002",
                        "name" : "Mr.B"
                    }
                ],
                "general": [
                    {
                        "serial_number": "0003",
                        "name" : "Mr.C"
                    },
                    {
                        "serial_number": "0004",
                        "name" : "Mr.D"
                    }
                ]
            },
            {
                "ward": "7",
                "grievance": [
                    {
                        "serial_number": "0005",
                        "name" : "Mr.E"
                    },
                    {
                        "serial_number": "0006",
                        "name" : "Mr.F"
                    }
                ],
                "general": [
                    {
                        "serial_number": "0007",
                        "name" : "Mr.G"
                    },
                    {
                        "serial_number": "0008",
                        "name" : "Mr.H"
                    }
                ]
            }
        ]
    },
    {
        "district": "Hooghly",
        "ward_no": [
            {
                "ward": "8",
                "grievance": [
                    {
                        "serial_number": "0009",
                        "name" : "Mr.I"
                    },
                    {
                        "serial_number": "0010",
                        "name" : "Mr.J"
                    }
                ],
                "general": [
                    {
                        "serial_number": "0011",
                        "name" : "Mr.K"
                    },
                    {
                        "serial_number": "0012",
                        "name" : "Mr.L"
                    }
                ]
            },
            {
                "ward": "9",
                "grievance": [
                    {
                        "serial_number": "0013",
                        "name" : "Mr.M"
                    },
                    {
                        "serial_number": "0014",
                        "name" : "Mr.N"
                    }
                ],
                "general": [
                    {
                        "serial_number": "0015",
                        "name" : "Mr.O"
                    },
                    {
                        "serial_number": "0018",
                        "name" : "Bruno Fernandes"
                    }
                ]
            }
        ]
    }
]

代码:

const queryNew = {
        district: "Kolkata",
        ward: "6",
        category: "grievance"
    };

    const data = {
        serial_number: "0034",
        name: "Donny Van De Beek"
    };

    const districtData = testData.filter(value => value.district === queryNew.district)[0];
    const indexArray = districtData.ward_no.filter((value, index) => value.ward === queryNew.ward)[0][queryNew.category];

    console.log(testData);

查询参数是加尔各答、6 和申诉,我已过滤到两个级别。我只需要知道如何在上述查询中插入data

P.S 应用解决方案后,我多次出现 Donny Van De Beek。

import React from "react";
import testData from './testData.json';

const Display = () => {
    const queryNew = {
        district: "Kolkata",
        ward: "6",
        category: "grievance"
    };

    const data = {
        serial_number: "0034",
        name: "Donny Van De Beek"
    };

    const districtData = testData.find(value => value.district === queryNew.district);
    if (districtData) {
        const wardData = districtData.ward_no.find(value => value.ward === queryNew.ward);
        if (wardData) {
            wardData[queryNew.category].push(data);
        }
    }

    console.log(districtData);

    return(
        <div></div>
    );
}

export default Display;

【问题讨论】:

  • 您想更新 Array 的某些特定对象。对吧?
  • 使用 filter() 是错误的方法,因为它返回一个新数组。使用find()返回匹配的区和病房的对象,然后将数据推送到该对象的申诉数组中
  • 查看您的代码,看起来该对象超出了组件的范围。而且因为对象没有被深度复制,所以每次渲染组件时都会向同一个数组中添加内容。
  • stackoverflow.com/questions/28876300/… 。看这个。 var testData2 = JSON.parse(JSON.stringify(testData)); 在您的组件中创建一个 testData2。这将是一个深层副本
  • @TusharShahi 似乎可以解决问题,尽管我无法知道该对象如何或为什么超出了组件的范围。将不得不检查

标签: javascript reactjs


【解决方案1】:

我认为filter() 不是必需的。过滤器是从数组中删除一些项目并得到休息。只需使用find() 并不断从嵌套数组中获取正确的索引。 find() 将根据条件为您提供数组中的匹配索引之一。如果没有匹配的数组元素,则返回undefined

因为,对象是引用。您所做的任何更新都会反映在主数组中。

let mainData = [
    {
        "district": "Kolkata",
        "ward_no": [
            {
                "ward": "6",
                "grievance": [
                    {
                        "serial_number": "0001",
                        "name" : "Mr.A"
                    },
                    {
                        "serial_number": "0002",
                        "name" : "Mr.B"
                    }
                ],
                "general": [
                    {
                        "serial_number": "0003",
                        "name" : "Mr.C"
                    },
                    {
                        "serial_number": "0004",
                        "name" : "Mr.D"
                    }
                ]
            },
            {
                "ward": "7",
                "grievance": [
                    {
                        "serial_number": "0005",
                        "name" : "Mr.E"
                    },
                    {
                        "serial_number": "0006",
                        "name" : "Mr.F"
                    }
                ],
                "general": [
                    {
                        "serial_number": "0007",
                        "name" : "Mr.G"
                    },
                    {
                        "serial_number": "0008",
                        "name" : "Mr.H"
                    }
                ]
            }
        ]
    },
    {
        "district": "Hooghly",
        "ward_no": [
            {
                "ward": "8",
                "grievance": [
                    {
                        "serial_number": "0009",
                        "name" : "Mr.I"
                    },
                    {
                        "serial_number": "0010",
                        "name" : "Mr.J"
                    }
                ],
                "general": [
                    {
                        "serial_number": "0011",
                        "name" : "Mr.K"
                    },
                    {
                        "serial_number": "0012",
                        "name" : "Mr.L"
                    }
                ]
            },
            {
                "ward": "9",
                "grievance": [
                    {
                        "serial_number": "0013",
                        "name" : "Mr.M"
                    },
                    {
                        "serial_number": "0014",
                        "name" : "Mr.N"
                    }
                ],
                "general": [
                    {
                        "serial_number": "0015",
                        "name" : "Mr.O"
                    },
                    {
                        "serial_number": "0018",
                        "name" : "Bruno Fernandes"
                    }
                ]
            }
        ]
    }
];

const queryNew = {
        district: "Kolkata",
        ward: "6",
        category: "grievance"
    };
const data = {
        serial_number: "0034",
        name: "Donny Van De Beek"
    };
    
let districtData = mainData.find(x => x.district === queryNew.district);
if(districtData){
    let ward = districtData.ward_no.find( x => x.ward === queryNew.ward);
    if(ward) 
      ward[queryNew.category].push(data);
}

console.log(districtData);

if 条件用于检查。如果您确信您的数据存在,则可以跳过它们。

【讨论】:

  • 你知道为什么我得到多次插入的数据吗?长度从3增加到4。请查看最新截图
  • @coolhack7 代码 sn -p 输出不是你所期望的吗?你在做不同的事情吗?请更新您尝试过的新代码
  • 我已经用代码更新了问题。它就在屏幕截图的正下方
【解决方案2】:

这样试试

const districtData = testData.find(
  (item) => item.district === queryNew.district
);
const wardData = districtData.ward_no.find(
  (item) => item.ward === queryNew.ward
);

wardData[queryNew.category].push(data);

console.log(testData);

代码 => https://codesandbox.io/s/javascript-forked-qelt9?file=/index.js

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-08
    • 1970-01-01
    相关资源
    最近更新 更多