Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/420.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将对象数组筛选为新数组_Javascript_Arrays_Reactjs_Filter - Fatal编程技术网

Javascript 将对象数组筛选为新数组

Javascript 将对象数组筛选为新数组,javascript,arrays,reactjs,filter,Javascript,Arrays,Reactjs,Filter,在这方面,我有: state = { Producers: [], France: [], Spain: [], Germany: [], Portugal: [], Greece: [], Austria: [], isLoading: false }; 生产者阵列: { "_id" : ObjectId("5cc0bf1815cc7a2225edab0b"), "C

在这方面,我有:

    state = {
     Producers: [], 
     France: [],
     Spain: [],
     Germany: [],
     Portugal: [],
     Greece: [],
     Austria: [],
     isLoading: false
     };
生产者阵列:

     {
    "_id" : ObjectId("5cc0bf1815cc7a2225edab0b"),
    "Code" : "FPG-BCH14",
    "URL" : "/jSQcl",
    "Just_In" : "",
    "Country" : "France",
    "Region" : "Burgundy"
},
{
    "_id" : ObjectId("5cc0bf1815cc7a2225edab0c"),
    "Code" : "FPG-CHA17",
    "URL" : "/XPxx",
    "Just_In" : "",
    "Country" : "France",
    "Region" : "Burgundy"  
},
{
    "_id" : ObjectId("5cc0bf1815cc7a2225edab0d"),
    "Code" : "FPG-BPN16",
    "Just_In" : "",
    "Country" : "France",
    "Region" : "Burgundy"

},

{
    "_id" : ObjectId("5cc0bf1815cc7a2225edab0e"),
    "Code" : "PAP-VIN17",
    "Country" : "Portugal",
    "Region" : "Vinho Verde",
    "Subregion" : "Lima"

}
现在我把所有对象都放在state.Producers中,我想把任何值为state.Producers.Country==France的对象放在所有国家,以此类推

这就是我设置状态的方式:

    loadProducers = () => {

     API.getProducers()
     .then(res => 
     this.setState({Producers: res.data})
     )
     .catch(err => console.log(err));
       }
所以我想在为生产者设置状态之后需要另一个.then语句,然后为每个国家/地区设置.filter语句,但我似乎无法让它工作。

假设res.data的结构为[{country:string},{country:string}…],则可以创建一个updatedState对象并将项推入其中

大概是这样的:

const loadProducers = () => {
    API.getProducers()
    .then(res => {
        const updatedState = {
            Producers: [], 
            France: [],
            Spain: [],
            Germany: [],
            Portugal: [],
            Greece: [],
            Austria: []
        };
        res.data.forEach((item) => {
            updatedState[item.Country].push(item);
        })
        // This line if you also need everything inside Producers
        updatedState.Producers = res.data;

        this.setState(updatedState);
    })
    .catch(err => console.log(err));
}
假设res.data的结构为[{Country:string},{Country:string}…],则可以创建一个updatedState对象并将项推入其中

大概是这样的:

const loadProducers = () => {
    API.getProducers()
    .then(res => {
        const updatedState = {
            Producers: [], 
            France: [],
            Spain: [],
            Germany: [],
            Portugal: [],
            Greece: [],
            Austria: []
        };
        res.data.forEach((item) => {
            updatedState[item.Country].push(item);
        })
        // This line if you also need everything inside Producers
        updatedState.Producers = res.data;

        this.setState(updatedState);
    })
    .catch(err => console.log(err));
}

你可以这样做

loadProducers = () => {
 API.getProducers()
  .then(({ data }) =>
    // Here we reduce all the results with respect to the country associated with
    updatedState = data.reduce((res, obj) => {
     if (!res[obj.Country]) {
       res[obj.Country] = [];
     }
     return { ...res, [obj.Country]: [...res[obj.Country], obj] }
    }, {});

    // Push all the data into Producers provided that you need it here. else you can ignore this line :)
    updatedState.Producers = data;

    //Finally update the state 
    this.setState(updatedState);
  ).catch(({ response }) => console.log(response));
}

希望这有帮助。

你可以这样做

loadProducers = () => {
 API.getProducers()
  .then(({ data }) =>
    // Here we reduce all the results with respect to the country associated with
    updatedState = data.reduce((res, obj) => {
     if (!res[obj.Country]) {
       res[obj.Country] = [];
     }
     return { ...res, [obj.Country]: [...res[obj.Country], obj] }
    }, {});

    // Push all the data into Producers provided that you need it here. else you can ignore this line :)
    updatedState.Producers = data;

    //Finally update the state 
    this.setState(updatedState);
  ).catch(({ response }) => console.log(response));
}
希望这有帮助。

React.ComponentsetState不会返回任何内容,因此Promisethen将有一个未定义的消息传递给它的回调。要避免这种情况,请改为传递,以便在状态更新之后运行。您希望使用生命周期的原因有很多,其中包括:您可以轻松更改数据源的来源,而无需更改状态本身的派生方式,生命周期几乎不需要维护,当组件更新时,它将始终运行,这意味着您不会因为异步条件而出现计时问题

this.componentDidUpdate=函数componentDidUpdate 以前的道具, 先前状态 { //将其包装在比较中,这样就不会无限循环 如果//在此处将制作人与以前的制作人进行比较{ //他们已经改变,更新状态,使用更新程序来防止时间问题 this.setStatestate=>{ //保持更改数据的同步 //这还允许您获取随时间变化的数据 const update={…state}; state.producers.forEachproducer=>{ //安全初始化 更新[producer.Country]=更新[producer.Country]| |[]; 如果!更新[producer.country].findproducer{ //推 更新[producer.Country].pushproducer; } }; 返回更新; } } } 这保证在类中以安全的方式在状态更新上运行,并使您的concernsfetch和派生结构保持独立且易于维护。

React.ComponentsetState不会返回任何内容,因此Promisethen将有一个未定义的传递给它的回调。要避免这种情况,请改为传递,以便在状态更新之后运行。您希望使用生命周期的原因有很多,其中包括:您可以轻松更改数据源的来源,而无需更改状态本身的派生方式,生命周期几乎不需要维护,当组件更新时,它将始终运行,这意味着您不会因为异步条件而出现计时问题

this.componentDidUpdate=函数componentDidUpdate 以前的道具, 先前状态 { //将其包装在比较中,这样就不会无限循环 如果//在此处将制作人与以前的制作人进行比较{ //他们已经改变,更新状态,使用更新程序来防止时间问题 this.setStatestate=>{ //保持更改数据的同步 //这还允许您获取随时间变化的数据 const update={…state}; state.producers.forEachproducer=>{ //安全初始化 更新[producer.Country]=更新[producer.Country]| |[]; 如果!更新[producer.country].findproducer{ //推 更新[producer.Country].pushproducer; } }; 返回更新; } } }
这可以保证在类中以安全的方式在状态更新上运行,并使您的concernsfetch和DerivativesDerivated结构保持独立且易于维护。

您可以发布一个如何设置数据结构的示例吗?res.data对象请澄清您的问题,例如您希望最终实现什么以及您希望如何进行比较?通常最好不要像这样重复状态。如果制作人已经拥有了你的所有数据,只需在呈现之前对其进行过滤:const france=state.Producers.filterp=>p.Country==francythanks@RobertMennell@BrunoMonteiro,我正在进一步了解这一点。。。我已经编辑了上面的问题,以包含state.Producers数组中的示例。非常感谢所有的投入!你能举个例子说明你的数据结构是如何设置的吗?res.data对象请澄清您的问题,例如您希望最终实现什么以及您希望如何进行比较?通常最好不要像这样重复状态。如果制作人已经拥有了你的所有数据,只需在呈现之前对其进行过滤:const france=state.Producers.filterp=>p.Country==francythanks@RobertMennell@BrunoMonteiro,我正在进一步了解这一点。。。我已经编辑了上面的问题以包含一个示例

状态中的内容。生产者数组。非常感谢所有的投入!这将容易出现计时问题,因此可能不可靠。这意味着维护获取也意味着维护派生状态感谢您的评论,但是,维护fetch意味着维护派生状态?如果他们从使用fetch改为使用不使用的库,会发生什么情况?然后,或者他们决定将其包装到另一个库中,以获得更易于维护的自以为是的响应检查器任何东西400转到另一个回调,200转到成功?他们需要维护更多的逻辑,而不仅仅是确保一个对象上的同一个键是一个对象数组,该数组中有一个国家/地区键将被置于状态,他们将始终需要调整函数嗯……但这听起来与答案没有问题。问题更多地涉及javascript以及如何解析对多个数组的响应。如果方法更改为不使用承诺,那么无论如何都需要重构。我明白你的意思,但是不要同意否决票…如果我否决你的回答,说如果他们想将密钥从国家/地区更改为其他国家/地区,你不处理也是一样的…这将容易出现时间问题,因此可能不可靠。这意味着维护获取也意味着维护派生状态谢谢你的评论,但是,维护fetch意味着维护派生状态?如果他们从使用fetch改为使用不使用的库,会发生什么情况?然后,或者他们决定将其包装到另一个库中,以获得更易于维护的自以为是的响应检查器任何东西400转到另一个回调,200转到成功?他们需要维护更多的逻辑,而不仅仅是确保一个对象上的同一个键是一个对象数组,该数组中有一个国家/地区键将被置于状态,他们将始终需要调整函数嗯……但这听起来与答案没有问题。问题更多地涉及javascript以及如何解析对多个数组的响应。如果方法更改为不使用承诺,那么无论如何都需要重构。我明白你的意思,但不同意否决票…如果我否决你的回答,说如果他们想把钥匙从国家换到其他地方,你不处理,也是一样的…这将容易出现时间问题,可能不可靠。你说的时间问题是什么意思?也许你应该给出更多的细节,而不仅仅是期望我们在你评分下降时搜索谷歌。如果我提出两个请求,它们几乎同时到达,但旧数据第二次到达,会发生什么,由于状态更新的异步性质,正在清除新数据?我想问题在于如何做,而不是在哪里做。@RobertMennell,如果您有多个api,并且每个api返回不同的数据结构,您是否将您的状态限制为标准结构,而不考虑在进行多个API调用时将要出现的数据类型?在这种情况下,即使您的方法也不可维护,并且可能需要使用状态管理库,如redux。这将容易出现计时问题,并且可能不可靠。您所说的计时问题是什么意思?也许你应该给出更多的细节,而不仅仅是期望我们在你评分下降时搜索谷歌。如果我提出两个请求,它们几乎同时到达,但旧数据第二次到达,会发生什么,由于状态更新的异步性质,正在清除新数据?我想问题在于如何做,而不是在哪里做。@RobertMennell,如果您有多个api,并且每个api返回不同的数据结构,您是否将您的状态限制为标准结构,而不考虑在进行多个API调用时将要出现的数据类型?在这种情况下,即使您的方法也不可维护,可能需要使用状态管理库,如redux。componentDidUpdate是一种生命周期方法,您不需要绑定它。很好的捕获,删除该componentDidUpdate是一种生命周期方法,您不需要绑定它。很好的捕获,删除它