Преобразование данных Json

Json

    [
{"stars":1,"q1":0,"q2":0,"q3":0,"q4":0,"q5":0,"q6":2,"q7":0,"q8":0,"q9":0,"q10":0,"q11":0},
{"stars":2,"q1":2,"q2":0,"q3":0,"q4":0,"q5":0,"q6":0,"q7":0,"q8":0,"q9":0,"q10":0,"q11":0},
{"stars":3,"q1":1,"q2":0,"q3":0,"q4":1,"q5":1,"q6":1,"q7":0,"q8":1,"q9":1,"q10":0,"q11":1},
{"stars":4,"q1":0,"q2":0,"q3":0,"q4":0,"q5":0,"q6":0,"q7":1,"q8":0,"q9":0,"q10":1,"q11":0},
{"stars":5,"q1":0,"q2":3,"q3":3,"q4":2,"q5":2,"q6":0,"q7":2,"q8":2,"q9":2,"q10":2,"q11":2}
]

Я хочу получить каждую строку в переменной diff, например:

{"stars":1,"q1":0,"q2":0,"q3":0,"q4":0,"q5":0,"q6":2,"q7":0,"q8":0,"q9":0,"q10":0,"q11":0}

data: [0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0]

используя javascript

я пробую это

$(document).ready(function () {

        $.ajax({
            type: "Post",
            url: "FeedBackGraph.aspx/getdata",
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function (Response) {
                debugger;
                var d = Response.d.toString();
                var final_string = d;

                var res = final_string.split(",").map(Number);
                console.info(final_string);

попробуй, прежде чем просить о помощи

Always Sunny 27.10.2018 15:04

Вам нужна разница каждого элемента массива с некоторым массивом не в основном объекте?

Goran.it 27.10.2018 15:10
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
2
122
5

Ответы 5

Вы можете использовать функцию reduce для построения массива вместе с функцией Object.values для извлечения значений для каждого объекта.

let arr = [{"stars":1,"q1":0,"q2":0,"q3":0,"q4":0,"q5":0,"q6":2,"q7":0,"q8":0,"q9":0,"q10":0,"q11":0},{"stars":2,"q1":2,"q2":0,"q3":0,"q4":0,"q5":0,"q6":0,"q7":0,"q8":0,"q9":0,"q10":0,"q11":0},{"stars":3,"q1":1,"q2":0,"q3":0,"q4":1,"q5":1,"q6":1,"q7":0,"q8":1,"q9":1,"q10":0,"q11":1},{"stars":4,"q1":0,"q2":0,"q3":0,"q4":0,"q5":0,"q6":0,"q7":1,"q8":0,"q9":0,"q10":1,"q11":0},{"stars":5,"q1":0,"q2":3,"q3":3,"q4":2,"q5":2,"q6":0,"q7":2,"q8":2,"q9":2,"q10":2,"q11":2}],
    result = arr.reduce((a, c) => a.concat({data: Object.values(c).slice(1)}), []);

console.info(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

Порядок свойств объекта не гарантируется, следовательно, порядок значений также не гарантируется.

VLAZ 27.10.2018 15:23

map над объектами и возвращает их значения за вычетом первого элемента. Вы можете получить доступ к этим новым массивам, используя их индексы.

const arr = [{"stars":1,"q1":0,"q2":0,"q3":0,"q4":0,"q5":0,"q6":2,"q7":0,"q8":0,"q9":0,"q10":0,"q11":0},{"stars":2,"q1":2,"q2":0,"q3":0,"q4":0,"q5":0,"q6":0,"q7":0,"q8":0,"q9":0,"q10":0,"q11":0},{"stars":3,"q1":1,"q2":0,"q3":0,"q4":1,"q5":1,"q6":1,"q7":0,"q8":1,"q9":1,"q10":0,"q11":1},{"stars":4,"q1":0,"q2":0,"q3":0,"q4":0,"q5":0,"q6":0,"q7":1,"q8":0,"q9":0,"q10":1,"q11":0},{"stars":5,"q1":0,"q2":3,"q3":3,"q4":2,"q5":2,"q6":0,"q7":2,"q8":2,"q9":2,"q10":2,"q11":2}];

const out = arr.map(a => Object.values(a).slice(1));
console.info(JSON.stringify(out[0]));

А вот версия, которая удовлетворит опасения vlaz по поводу того, что ключи могут быть в неправильном порядке:

const arr = [{"stars":1,"q1":0,"q2":0,"q3":0,"q4":0,"q5":0,"q6":2,"q7":0,"q8":0,"q9":0,"q10":0,"q11":0},{"stars":2,"q1":2,"q2":0,"q3":0,"q4":0,"q5":0,"q6":0,"q7":0,"q8":0,"q9":0,"q10":0,"q11":0},{"stars":3,"q1":1,"q2":0,"q3":0,"q4":1,"q5":1,"q6":1,"q7":0,"q8":1,"q9":1,"q10":0,"q11":1},{"stars":4,"q1":0,"q2":0,"q3":0,"q4":0,"q5":0,"q6":0,"q7":1,"q8":0,"q9":0,"q10":1,"q11":0},{"stars":5,"q1":0,"q2":3,"q3":3,"q4":2,"q5":2,"q6":0,"q7":2,"q8":2,"q9":2,"q10":2,"q11":2}];

// get the keys from the first object
const keys = Object.keys(arr[0])

  // remove stars
  .filter(el => el !== 'stars')

  // sort by key q1 to q11
  .sort((a, b) => +a.match(/\d+/) > +b.match(/\d+/));

// map over the data again and build new arrays based on the
// ordered keys
const out = arr.map(({stars, ...el}) => {
  return keys.reduce((acc, c) => acc.concat(el[c]), [])
}, []);

console.info(JSON.stringify(out[0]));

Порядок свойств объекта не гарантируется, следовательно, порядок значений также не гарантируется.

VLAZ 27.10.2018 15:23
«Порядок свойств такой же, как при переборе значений свойств объекта вручную». - так что я предполагаю, что OP с этим согласен.
Andy 27.10.2018 15:25

q6 может появиться раньше, чем q1. И OP может даже не знать об этом. Слишком много людей - нет.

VLAZ 27.10.2018 15:26

Обновил мой ответ @vlaz

Andy 27.10.2018 15:45

Вы можете использовать map() для цикла по массиву. Используйте destructuring assignment, чтобы удалить свойство, которое вы не хотите включать (stars), и используйте Object.values для преобразования объекта в массив.

var arr = [{"stars":1,"q1":0,"q2":0,"q3":0,"q4":0,"q5":0,"q6":2,"q7":0,"q8":0,"q9":0,"q10":0,"q11":0},{"stars":2,"q1":2,"q2":0,"q3":0,"q4":0,"q5":0,"q6":0,"q7":0,"q8":0,"q9":0,"q10":0,"q11":0},{"stars":3,"q1":1,"q2":0,"q3":0,"q4":1,"q5":1,"q6":1,"q7":0,"q8":1,"q9":1,"q10":0,"q11":1},{"stars":4,"q1":0,"q2":0,"q3":0,"q4":0,"q5":0,"q6":0,"q7":1,"q8":0,"q9":0,"q10":1,"q11":0},{"stars":5,"q1":0,"q2":3,"q3":3,"q4":2,"q5":2,"q6":0,"q7":2,"q8":2,"q9":2,"q10":2,"q11":2}]

var result = arr.map(({stars,...r}) => Object.values(r))

console.info(result);

Если вы хотите, порядок массива будет основан на ключе. Вы можете создать переменную order. Назначьте порядок на первой петле map(). Используйте Object.keys, чтобы получить все ключи. Используйте sort() для сортировки ключей.

Используйте другой map(), чтобы перебрать переменную порядка и построить новый массив для возврата.

var arr = [{"stars":1,"q2":0,"q1":0,"q3":0,"q4":0,"q5":0,"q6":2,"q7":0,"q8":0,"q9":0,"q10":0,"q11":0},{"stars":2,"q1":2,"q2":0,"q3":0,"q4":0,"q5":0,"q6":0,"q7":0,"q8":0,"q9":0,"q10":0,"q11":0},{"stars":3,"q1":1,"q2":0,"q3":0,"q4":1,"q5":1,"q6":1,"q7":0,"q8":1,"q9":1,"q10":0,"q11":1},{"stars":4,"q1":0,"q2":0,"q3":0,"q4":0,"q5":0,"q6":0,"q7":1,"q8":0,"q9":0,"q10":1,"q11":0},{"stars":5,"q1":0,"q2":3,"q3":3,"q4":2,"q5":2,"q6":0,"q7":2,"q8":2,"q9":2,"q10":2,"q11":2}];

var order = null;
var result = arr.map(({stars,...r}) => {
  if (order === null) order = Object.keys(r).sort((a, b) => a.localeCompare(b, undefined, {numeric: true,sensitivity: 'base'}));
  return order.map(o => r[o]);
});

console.info(result);

Порядок свойств объекта не гарантируется, следовательно, порядок значений также не гарантируется.

VLAZ 27.10.2018 15:24

Я думаю, что все понимают это сообщение.

Andy 27.10.2018 15:26

А они? Три разных пользователя с высоким уровнем репутации придумали одно и то же потенциально неправильное решение, когда это одна из самых распространенных проблем новичков здесь, на SO - люди, предполагающие, что порядок свойств объектов «установлен».

VLAZ 27.10.2018 15:28

Начиная с нет гарантии порядка собственности в объекте, вам нужно принять меры предосторожности, чтобы убедиться, что вы получите правильный результат.

var data = [
  {"stars":1,"q1":0,"q2":0,"q3":0,"q4":0,"q5":0,"q6":2,"q7":0,"q8":0,"q9":0,"q10":0,"q11":0},
  {"stars":2,"q1":2,"q2":0,"q3":0,"q4":0,"q5":0,"q6":0,"q7":0,"q8":0,"q9":0,"q10":0,"q11":0},
  {"stars":3,"q1":1,"q2":0,"q3":0,"q4":1,"q5":1,"q6":1,"q7":0,"q8":1,"q9":1,"q10":0,"q11":1},
  {"stars":4,"q1":0,"q2":0,"q3":0,"q4":0,"q5":0,"q6":0,"q7":1,"q8":0,"q9":0,"q10":1,"q11":0},
  {"stars":5,"q1":0,"q2":3,"q3":3,"q4":2,"q5":2,"q6":0,"q7":2,"q8":2,"q9":2,"q10":2,"q11":2}
]

var convertedObject = transformObject(data[0]);
console.info("transforming single object", convertedObject);

var convertedArray = data.map(transformObject);
console.info("transforming the entire array", convertedArray);


function convertKeyToNumeric(key) {
  var numericString = key.slice(1); //remove the first character 
  return Number(numericString);
}

function transformObject(obj) {
  return Object.keys(obj) //get keys
    .filter(key => key !== "stars") //remove "stars"
    .sort((a, b) => convertKeyToNumeric(a) - convertKeyToNumeric(b)) //sort in ascending order
    .map(key => obj[key]) //get the values
}
  • Object.keys извлекает ключи, чтобы вы могли с ними работать.
  • Array#filter исключает ключи, которые вам не нужны.
  • Array#sort обеспечивает правильный порядок ваших свойств, поэтому они не будут обрабатываться в неправильном порядке, например q8 -> q6 -> q10 -> q7 -> q9 -> q2 -> q1 - > q5 -> q3 -> q11 -> q4
  • Затем Array#map дает вам значения.

Функция convertKeyToNumeric извлечена для ясности. Его можно переписать различными способами, в зависимости от типа ключей, которые вы получите. Это строго для тех, которые начинаются с одного нечислового символа.

Спасибо за ответ, но я сталкиваюсь с ошибкой ответа ajax в этом методе, например: var data = [Response from ajax] формат находится в фигурных скобках, например: «[{values}]», а при использовании фрагмента для разделения »от указания и окончания строки это удалить [] из строки не ""

aparna rai 29.10.2018 07:50

@aparnarai это потому, что вы получаете объект и превращаете его в нить при вызове Response.d.toString(). Вы можете просто получить Response.d, чтобы получить его и обработать как объект. Если это уже строка, то .toString() вообще не нужен, но вам следует использовать JSON.parse(Response.d).

VLAZ 30.10.2018 14:42
let data = (row)=>{
  let {q1,q2,q3,q4,q5,q6,q7,q8,q9,q10,q11}=row;
  return [q1,q2,q3,q4,q5,q6,q7,q8,q9,q10,q11];
};

data(json[0]); 

Output [0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0]

  • Я предполагаю, что данные имеют только q1 - q11
  • json - это объект ответа

Другие вопросы по теме