Сначала вам нужно разобрать значения транспортного средства в отдельные массивы элементов опций JSX. Я предпочитаю делать это с помощью функции приведения ...
const vehicles = this.state.veh_data.reduce((acc, veh) => {
let make = Object.keys(veh)[0],
vehModels = veh[make];
return {
makes: [
...acc.makes,
],
models:[
...acc.models,
...vehModels.map(model => {
return
})
]
};
},{makes:[], models:[]});
Поскольку каждый элемент в вашем массиве veh_data является объектом, вам необходимо получить доступ к его первому (и единственному) свойству с помощью Object.keys (), чтобы получить все ключи объекта, а затем просто захватить первый (и единственный) ключ.
Доступ к модели можно получить, получив значение этого ключа в каждом объекте, над которым вы перебираете
...
{vehicles.makes}
...
{vehicles.models}
...
Учитывая контекст, я также не вижу необходимости хранить veh_data в состоянии компонента, что является пустой тратой ресурсов, если только эти данные не будут обновлять пользовательский интерфейс динамически, поэтому это будет полное решение .... [ 1113]
https://jsfiddle.net/mfpv1L6s/
(ПРИМЕЧАНИЕ: я понимаю, что это не даст вам полного решения, которое вы «должны» искать, как покажет варианты моделей для каждого транспортного средства, а не только модели, относящиеся к выбранной в настоящий момент марке, но это должно стать хорошей отправной точкой для вас.)
ДОПОЛНИТЕЛЬНЫЙ КРЕДИТ: Я бы также проанализировал этот вариант ценности представления чему-то более привлекательному, как это ...
keyToOption(key){
return key.split('-')
.map(word=> word.slice(0,1).toUpperCase + word.slice(1))
.join(' ');
}
Затем добавьте его в функцию приведения, как это ...
makes: [
...acc.makes,
],
Я включил вышеупомянутое в JSFiddle
(Полный рабочий пример ....)
import React, { Component } from "react";
import { Form, FormGroup, Input } from "reactstrap";
// import { veh_data } from '../shared/vehicle_make_and_models'
const veh_data = [
{ "alfa-romeo": ["145", "90", "Alfa 6", "Alfasud"] },
{ "aston-martin": ["15", "2-Litre", "AM Vantage", "Atom", "Cygnet", "DB2"] },
{ audi: ["100", "200", "A1", "A2", "A3", "A4", "A5", "A6", "A7"] }
];
const vehicles = parseVehicleList(veh_data)
class ImgAndForm extends Component {
state = { modelSelected: null };
handleSearch(event) {
alert("Search button clicked");
event.preventDefault();
}
handleModelChange(event) {
console.log(event.target.value);
this.setState({ modelSelected: event.target.value });
}
render() {
const selectedModels =
this.state.modelSelected && this.state.modelSelected.length ? (
vehicles.models[this.state.modelSelected]
) : (
);
return (
Search
);
}
}
export default ImgAndForm;
function parseVehicleList(data) {
return data.reduce(
(acc, veh, i) => {
let make = Object.keys(veh)[0],
vehModels = veh[make];
return {
makes: [
...acc.makes,
],
models: {
...acc.models,
[make]: vehModels.map((model, i) => {
return (
);
})
}
};
},
{ makes: [], models: {} }
);
}
function keyToOption(key) {
return key
.split("-")
.map(word => word.slice(0, 1).toUpperCase() + word.slice(1))
.join(" ");
}
Задачи Ant Банки/Уха являются подзадачами более общего задача Zip. Это означает, что можно также использовать zipfileset
в задаче Банки:
<jar destfile="${jar.file}" basedir="...">
<zipfileset dir="${project.path}" includes="*.jar" prefix="libs"/>
</jar>
я также видел, что Вы определяете отдельный файл манифеста для включения в Банку. Можно также использовать вложенный manifest
команда:
<jar destfile="@{destfile}" basedir="@{basedir}">
<manifest>
<attribute name="Built-By" value="..."/>
<attribute name="Built-Date" value="..."/>
<attribute name="Implementation-Title" value="..."/>
<attribute name="Implementation-Version" value="..."/>
<attribute name="Implementation-Vendor" value="..."/>
</manifest>
</jar>
Один путь состоит в том, чтобы использовать задачи Ant:
Муравей Руководство имеет примеры того, как сделать это.