У меня есть массив, который выглядит так -
var myOldArray = [{
"id": 1,
"form_id": 4,
"form_field_name": "field_1",
"helperTitle": "This is Box 1's TItle",
"helperText": "This is Box 1 data",
"created_at": null,
"updated_at": null
},
{
"id": 2,
"form_id": 4,
"form_field_name": "field_2",
"helperTitle": "Box 2 Title",
"helperText": "Box 2 TExt",
"created_at": null,
"updated_at": null
}
]
и мне нужно продублировать / скопировать / преобразовать / ... что угодно ... этот массив примерно так -
myNewArray = {
field_1['title'] = "This is Box 1's Title",
field_1['text'] = "This is Box 1 data",
field_2['title'] = "Box 2 Title",
field_2['text'] = "Box 2 Text",
}
так что я могу ссылаться на него
console.info(myNewArray.field_1.title)
или что-то более полезное.
Я безрезультатно пытался использовать метод фильтрации. Все, что я пытался, просто возвращает undefined. Я просто супер запутался. Есть ли лучший способ напрямую ссылаться на элементы в субмассиве без преобразования?
Это вроде как работало ... console.info выводит то, что я хотел, но возвращаемое значение выводилось как undefined, что меня сбивает.
myOldArray = [{
"id": 1,
"form_id": 4,
"form_field_name": "field_1",
"helperTitle": "This is Box 1's TItle",
"helperText": "This is Box 1 data",
"created_at": null,
"updated_at": null
},
{
"id": 2,
"form_id": 4,
"form_field_name": "field_2",
"helperTitle": "Box 2 Title",
"helperText": "Box 2 TExt",
"created_at": null,
"updated_at": null
}
]
var AR = myOldArray;
var newArr = AR.filter(function(item) {
if (item.form_field_name == fieldName) {
console.info('txt - ' + item + '\n\n');
return item;
}
});Кстати, ваш myNewArray должен быть объектом, а не массивом, потому что вы используете именованные свойства вместо ключей.
Да, я думал, что использовал фигурные скобки на myNewArray, но я пытался решить эту проблему около 6 часов ... утомление наступило ... Я исправил это.
Что не так (или не работает) с myOldArray[0].helperTitle?
Я не знаю, какой индекс массива мне нужен, когда я его выводю. Мне нужно ссылаться на определенные индексы - IE, мне нужно вывести helperTitle для индекса, где form_field_name = field_2, и я не знаю, является ли этот индекс 0 или 1, или в этом массиве может быть 100 элементов.
Пожалуйста, обновите фрагмент, который я сделал для вас, соответствующим HTML
@Deadlance Похоже, вам действительно нужно немного больше узнать о структурах данных в JS ...
@Ben Я работаю над тем, чтобы узнать как можно больше и как можно быстрее. Это просто странная проблема, на которой я застрял. Я не могу понять, как получить конкретные индексы многомерных массивов через пару ключ / значение вместо их индекса.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы можете сопоставить элементы в новых объектах с желаемыми свойствами как объекты.
Работает с
Array#map,field с другим объектом с переименованными свойствами,Object.assign и синтаксис распространения ...var data = [{ id: 1, form_id: 4, form_field_name: "field_1", helperTitle: "This is Box 1's TItle", helperText: "This is Box 1 data", created_at: null, updated_at: null }, { id: 2, form_id: 4, form_field_name: "field_2", helperTitle: "Box 2 Title", helperText: "Box 2 TExt", created_at: null, updated_at: null }],
result = Object.assign(
...data.map(({ id, helperTitle: title, helperText: text }) =>
({ ['field_' + id]: { title, text } }))
);
console.info(result);.as-console-wrapper { max-height: 100% !important; top: 0; }По-видимому, у меня проблемы с размещением кода в комментариях ... но я получаю сообщение об ошибке с предоставленным вами кодом, в котором говорится, что невозможно преобразовать undefined в объект.
$ .get ('/ api / system / formHelperText / 4', function (data) {if (data) {this.helpText = data;}} .bind (this)); var X = this.helpText; console.info (X); результат = Object.assign (... X.map (({id, helperTitle: title, helperText: text}) => ({['field_' + id]: {title, text}}))); console.info (результат);
это похоже на асинхронную проблему, из-за undefined вы видите массив в console.info? можно взять элемент из массива?
@Deadlance вам не нужно анализировать строку JSON для объекта
в моем плохо отформатированном выше коде первый console.info (X) действительно выводит массив в журнал, но console.info (результат) выдает ошибку
@Slai Я так не думаю. console.info (this.helpText [0] .helperTitle); выводит правильную строку. Проблема, с которой я столкнулся, заключается в том, что я не хочу выводить строку из [0] ... Мне нужно получить строку для индекса, где form_field_name = конкретная вещь.
как я уже писал, это может быть асинхронная проблема, когда вы обрабатываете данные, которые в данный момент недоступны.
@ninaScholz, похоже, проблема с асинхронностью ... Теперь выясним, как исправить эту проблему ...
@deadlance stackoverflow.com/questions/23667086/…
Я предполагаю, что вся обработка должна выполняться в функции $ .get:
$.getJSON('/api/system/formHelperText/4', function (data) {
var myNewArray = data.map(function(item) {
var obj = {};
obj['field_' + item.id] = { Title: item.helperTitle, Text: item.helperText };
return obj;
});
console.info(myNewArray);
};
Вы можете написать простой вызов reduce, чтобы получить желаемый результат:
const array=[{id:1,form_id:4,form_field_name:"field_1",helperTitle:"This is Box 1's TItle",helperText:"This is Box 1 data",created_at:null,updated_at:null},{id:2,form_id:4,form_field_name:"field_2",helperTitle:"Box 2 Title",helperText:"Box 2 TExt",created_at:null,updated_at:null}]
const result= array.reduce((acc, a) =>
(acc[a.form_field_name] = {title: a.helperTitle,text: a.helperText}, acc), {});
console.info(result);Ответ очень простой:
const objs = new Map();
for (const obj of myOldArray) {
objs.set(obj.form_field_name, obj);
}
И теперь вы можете получить доступ к своим объектам по имени поля:
const myObj = objs.get("field_1");
Опубликованный вопрос, похоже, вообще не включает любая попытка для решения проблемы. StackOverflow ожидает, что вы попробуй сначала решить свою проблему, поскольку ваши попытки помогают нам лучше понять, чего вы хотите. Измените вопрос, чтобы показать, что вы пробовали, и проиллюстрировать конкретное препятствие, с которым вы столкнулись с минимальный воспроизводимый пример. Для получения дополнительной информации см. Как спросить и возьмите тур.