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);
Вам нужна разница каждого элемента массива с некоторым массивом не в основном объекте?



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


Вы можете использовать функцию 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; }Порядок свойств объекта не гарантируется, следовательно, порядок значений также не гарантируется.
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]));Порядок свойств объекта не гарантируется, следовательно, порядок значений также не гарантируется.
q6 может появиться раньше, чем q1. И OP может даже не знать об этом. Слишком много людей - нет.
Обновил мой ответ @vlaz
Вы можете использовать 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);Порядок свойств объекта не гарантируется, следовательно, порядок значений также не гарантируется.
Я думаю, что все понимают это сообщение.
А они? Три разных пользователя с высоким уровнем репутации придумали одно и то же потенциально неправильное решение, когда это одна из самых распространенных проблем новичков здесь, на SO - люди, предполагающие, что порядок свойств объектов «установлен».
Начиная с нет гарантии порядка собственности в объекте, вам нужно принять меры предосторожности, чтобы убедиться, что вы получите правильный результат.
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 -> q4Array#map дает вам значения.Функция convertKeyToNumeric извлечена для ясности. Его можно переписать различными способами, в зависимости от типа ключей, которые вы получите. Это строго для тех, которые начинаются с одного нечислового символа.
Спасибо за ответ, но я сталкиваюсь с ошибкой ответа ajax в этом методе, например: var data = [Response from ajax] формат находится в фигурных скобках, например: «[{values}]», а при использовании фрагмента для разделения »от указания и окончания строки это удалить [] из строки не ""
@aparnarai это потому, что вы получаете объект и превращаете его в нить при вызове Response.d.toString(). Вы можете просто получить Response.d, чтобы получить его и обработать как объект. Если это уже строка, то .toString() вообще не нужен, но вам следует использовать JSON.parse(Response.d).
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]
попробуй, прежде чем просить о помощи