#javascript #arrays #loops #object
Вопрос:
У меня есть массив arr1, arr2, arr3
и массив объектов objarr
Я хотел бы получить массив объектов на основе условия
т. е. при передаче arr1 массив объектов objarr
должен возвращать только совпадающие ключи arr1
т. е. при передаче arr2 массив объектов objarr
должен возвращать только совпадающие ключи arr2
(если wrk
передан параметр, только покажите, что это правда )
т. е. при передаче arr3 массив объектов objarr
должен возвращать только совпадающие ключи arr3
var arr1=["name", "place"]
var arr2=["details", "wrk"]
var arr3=["name"]
var objarr=[
{id:1, name: "ayan", place: "MY", details: "finance" , wrk: true},
{id:2, name: "mike", place: "AU", details: "teaching", wrk: false },
{id:3, name: "john", place: "DE", details: "service" , wrk: true}
]
function outputData(arr1){
var final=[];
var result = objarr.map(e=>{
if(arr1.includes(Object.keys(e)){
final.push(e)
}
})
return final
;}
Expected Output;
//for arr1 is passed
[
{name: "ayan", place: "MY"},
{name: "mike", place: "AU"},
{name: "john", place: "DE"}
]
//for arr2 is passed
[
{details: "finance", wrk:true},
{details: "service", wrk: true}
]
//for arr3 is passed
[
{name: "ayan"},
{name: "mike"},
{name: "john"}
]
Ответ №1:
var arr1 = ["name", "place"];
var arr2 = ["details", "wrk"];
var arr3 = ["name"];
var objarr = [
{ id: 1, name: "ayan", place: "MY", details: "finance", wrk: true },
{ id: 2, name: "mike", place: "AU", details: "teaching", wrk: false },
{ id: 3, name: "john", place: "DE", details: "service", wrk: true }
]
function outputData(arr) {
var final = [];
objarr.forEach(obj => {
const temp = {};
arr.forEach(key => {
if(obj[key]){
temp[key]= obj[key];
}
});
if(Object.keys(temp).length===arr.length){
final.push(temp);}
});
return final;
}
console.log('arr1',outputData(arr1));
console.log('arr2',outputData(arr2));
console.log('arr3',outputData(arr3));
Ответ №2:
Вы можете легко достичь результата, используя reduce и for..of loop
var arr1 = ["name", "place"];
var arr2 = ["details", "wrk"];
var arr3 = ["name"];
var objarr = [
{ id: 1, name: "ayan", place: "MY", details: "finance", wrk: true },
{ id: 2, name: "mike", place: "AU", details: "teaching", wrk: false },
{ id: 3, name: "john", place: "DE", details: "service", wrk: true },
];
function getData(target, source) {
return target.reduce((acc, curr) => {
const obj = {};
for (let prop of source) {
obj[prop] = curr[prop];
}
if (Object.keys(obj).includes("wrk")) {
if (obj["wrk"]) acc.push(obj);
} else acc.push(obj);
return acc;
}, []);
}
console.log(getData(objarr, arr1));
console.log(getData(objarr, arr2));
console.log(getData(objarr, arr3));
/* This is not a part of answer. It is just to give the output fill height. So IGNORE IT */
.as-console-wrapper { max-height: 100% !important; top: 0; }
Ответ №3:
Попробуйте это решение:
function outputData(arr) {
return objarr.map(obj => Object.fromEntries(arr.map(k => [k, obj[k]])))
}
Комментарии:
1. arr2 не дает ожидаемого результата.
Ответ №4:
Поскольку вам нужно выбрать только определенные узлы objarr
, переход к Array.map
не даст результата. Используйте для этого какую-нибудь другую логику зацикливания.
Я пользовался Array.reduce
здесь.
Логические
- Повторите цикл
objarr
с помощьюArray.reduce
. - Пройдите через массив пареметров внутри редуктора.
- Проверьте, соответствует ли значение для каждого узла из массива параметров в объекте в
objarr
массиве. - Если значение истинно, добавьте его к объекту.
- Если длина ключей этого объекта совпадает с длиной массива параметров, переместите этот объект в накопитель.
Пожалуйста, обратите внимание: Эта логика проверяет истинное значение только для ключа «wrk». Если вы хотите проверить наличие всех логических значений, вы можете использовать условие, добавленное в качестве комментария чуть выше оператора if
var arr1 = ["name", "place"]
var arr2 = ["details", "wrk"]
var arr3 = ["name"]
var objarr = [
{ id: 1, name: "ayan", place: "MY", details: "finance", wrk: true },
{ id: 2, name: "mike", place: "AU", details: "teaching", wrk: false },
{ id: 3, name: "john", place: "DE", details: "service", wrk: true }
]
function outputData(arr) {
var result = objarr.reduce((acc, currNode) => {
const resp = {};
arr.forEach((option) => {
// Current condition is only for "wrk"
// To check truthy state for all boolean variables use the below condition
// ((typeof currNode[option] === "boolean" amp;amp; currNode[option]) || typeof currNode[option] !== "boolean")
if ((option === "wrk" amp;amp; currNode[option]) || option !== "wrk") {
resp[option] = currNode[option]
}
})
if(Object.keys(resp).length === arr.length) {
acc.push(resp)
}
return acc
}, []);
return resu<
}
console.log(outputData(arr1));
console.log(outputData(arr2));
console.log(outputData(arr3));
Комментарии:
1.
arr2
не дает того результата, которого хочет ОП2. @decpk хороший улов. Я обновил ответ.