Как отфильтровать данные в JavaScript - PullRequest
0 голосов
/ 20 марта 2019

Я работаю над собственным реактивным проектом.

В этом я получаю несколько данных из API, как показано ниже.

{
    Value: "895"
    Return: "2"
    Return1: "0.20"
    Return3: "0.40"
    Return5: "0.60"
    Return10: "0.50"
    StartDate: "2019-06-13"
}, {
    Value: "900"
    Return: "4"
    Return1: "0.10"
    Return3: "0.40"
    Return5: "0.70"
    Return10: "0.90"
    StartDate: "2019-06-14"
},

Но я пытаюсь взять все Возврат данных в некоторый возвращаемый массив, который мне нужен для отображения каждого индекса данных в плоский список.Но, здесь я запутался, как взять его в другой массив, потому что ключ возврата имеет 1,3,5 и т. Д. В конце ключа в каждом индексе.

const ValuesData = [];

if (ReturnsData) {
  ReturnsData.map((item, index) => {
    ValuesData.push({
     `${ReturnsData[index].Return`${index}`}`,
    });
  });
}

Может кто-нибудь подсказать мне, как взятьВернуть (1,3,5,10) данные в массив?

Ответы [ 6 ]

1 голос
/ 20 марта 2019

Используйте startWith с getOwnPropertyNames или Object.keys( your_object ).

var apiData = [{
    Value: "895",
    Return: "2",
    Return1: "0.20",
    Return3: "0.40",
    Return5: "0.60",
    Return10: "0.50",
    StartDate: "2019-06-13",
}, {
    Value: "900",
    Return: "4",
    Return1: "0.10",
    Return3: "0.40",
    Return5: "0.70",
    Return10: "0.90",
    StartDate: "2019-06-14",
}]

/* All values of each key thats starts with "Return" in flat array */
const valuesFlat = []
apiData.map( (it, idx) => 
	Object.getOwnPropertyNames(it).filter( prop => prop.startsWith("Return") )
	.map( name => apiData[idx][name]  )
	.forEach( its => valuesFlat.push(its) )
)
console.log( "Flat values" )
console.log( valuesFlat )

/* All values of each key thats starts with "Return", not flat array */
const values = apiData.map( (it, idx) => 
	Object.getOwnPropertyNames(it).filter( prop => prop.startsWith("Return") )
	.map( name => apiData[idx][name]  )
)
console.log("Values")
console.log(values)


const indexes = apiData.map( (it, idx) => 
	Object.getOwnPropertyNames(it)
	.map( (prop, idxs) => { if(prop.startsWith("Return")) return idxs} )
	.filter( prop => prop != undefined )
)
console.log("indexes")
console.log( indexes )



const indexesFlat = []

apiData.forEach( (it, idx) => 
	Object.getOwnPropertyNames(it)
	.map( (prop, idxs) => { if(prop.startsWith("Return")) return idxs} )
	.filter( prop => prop != undefined )
	.forEach( it => indexesFlat.push(it) )
)

console.log("Flat indexes")
console.log( indexesFlat )

const flatPropsWithValues = []
apiData.map( (it, idx) => 
	Object.getOwnPropertyNames(it)
	.filter( prop => prop.startsWith("Return") )
	.forEach( prop => flatPropsWithValues.push( { prop: prop, value: apiData[idx][prop] } ) )
)


console.log("Flat props with values")
console.log( flatPropsWithValues )

Log.d (TAG, "runON" + Thread.currentThread (). GetName ());

0 голосов
/ 20 марта 2019

Во-первых, я думаю, что вам лучше использовать forEach, а не map, поскольку вы не присваиваете этот оператор новому массиву и ничего не возвращаете в теле функции. В forEach вы можете перебирать каждый ключ и выполнять тест регулярного выражения, чтобы увидеть, начинается ли ключ с «Return». Если это так, поместите значение, связанное с этим ключом, в массив ValuesData.

let ValuesData = []

ReturnsData.forEach(item => {
    let reg = new RegExp(/^Return.*/)
    for (key in item) {
        if (reg.test(key)) {
            ValuesData.push(item[key]);
        }
    }
})

Что дает вам результат:

["2", "0.20", "0.40", "0.60", "0.50", "4", "0.10", "0.40", "0.70", "0.90"]

Это не имеет значения, какой номер приходит после возврата. Таким образом, вы можете получить Return12, Return1345, Return76524 и т. Д. И при этом получить желаемый результат.

0 голосов
/ 20 марта 2019

Должно работать следующее:

const ValuesData = [];

if (ReturnsData) {
  ReturnsData.map((item, index) => {
    ValuesData.push({
      ReturnsData[index][`Return${index}`],
    });
  });
}
0 голосов
/ 20 марта 2019

Допущения:

Я предполагаю, что ваши ключи всегда похожи на Return, Return1, Return3, Return5 and Return10 и что ваши данные уже хранятся в массиве (с именем ReturnsData). В этом случае вы можете сделать следующее:

var ValuesData = []; 
if (ReturnsData) {
  ValuesData = ReturnsData.map((item) => {
      return { item.Return, item.Return1, item.Return3, item.Return5, item.Return10 }; 
  });
}

Объяснение:

Функция map возвращает по умолчанию новый массив. Вот почему мы можем хранить новый массив непосредственно в ValuesData. Внутри функции карты мы зацикливаем ваши объекты. Затем к каждому элементу объекта можно получить доступ item.YOUR_KEY. В конце мы возвращаем новый объект. Затем следующий объект обрабатывается.

0 голосов
/ 20 марта 2019

Возвращает массив значений ключей Return1, Return3, Return5, Return10:

const ReturnsData = {
  Value: "900",
  Return: "4",
  Return1: "0.10",
  Return3: "0.40",
  Return5: "0.70",
  Return10: "0.90",
  StartDate: "2019-06-14"
};

const regex = /Return(1|3|5|10)/;

const ValuesData = Object.entries(ReturnsData)
  .filter(([k, v]) => regex.test(k))
  .map(([k, v]) => v);

console.log(ValuesData);
0 голосов
/ 20 марта 2019

Используйте вместо этого регулярное выражение и цикл:

const ValueData = [];
const re = new Regex('(Return[0-9]{1,2})');
if (ReturnsData) {
  for (const key in ReturnsData) {
    if (if ReturnsData.hasOwnProperty(key) && re.test(key)) {
      ValueData.push(ReturnsData[key]);
    }
  }
}

Регулярное выражение должно соответствовать любым данным, начинающимся с «Возврата» и заканчивающимся одним или двумя числами. Цикл for ... in просматривает ключи, проверяет, существуют ли они на объекте и соответствуют ли они регулярному выражению. Если это так, значение этого ключа добавляется в ValueData.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...