As you want keys under name
showing on the label, extract your key by doing this Object.keys(item.name)[0]
rather than item.name
. Also, pass an extra property(here index
) so that you can print your desired values from the checkboxes
array by the correct index. Here I've done that by using event.target
.
Update:
If you want unique values, simply declare a state so that you can add items into that array(when checked) and remove items from that array(when unchecked). Finally, put your array in a set and you're done. Use Array.from()
to convert the set into the array.
Here is the working code:
import React from "react";
const Checkbox = ({
type = "checkbox",
name,
index,
checked = false,
onChange,
}) => (
<input
type={type}
name={name}
data-index={index}
checked={checked}
onChange={onChange}
/>
);
const checkboxes = [
{
name: { english: ["project1", "project2"] },
key: "1",
label: "1",
},
{
name: { maths: ["project1", "project3"] },
key: "2",
label: "2",
},
{
name: { physics: ["project4", "project5"] },
key: "3",
label: "3",
},
{
name: { marketing: ["project1", "project2"] },
key: "4",
label: "4",
},
];
export default class App extends React.Component {
constructor(props) {
super(props);
this.state = {
checkedItems: new Map(),
checkedArrays: [],
};
this.handleChange = this.handleChange.bind(this);
}
handleChange(e) {
const item = e.target.name;
const isChecked = e.target.checked;
let [key, value] = Object.entries(
checkboxes[e.target.dataset.index].name
)[0];
console.log(isChecked);
console.log(key);
var len = value.length;
if (isChecked) {
for (var i = 0; i < len; i++) {
this.state.checkedArrays.push(value[i]);
}
} else {
for (var i = 0; i < len; i++) {
const index = this.state.checkedArrays.indexOf(value[i]);
if (index > -1) {
this.state.checkedArrays.splice(index, 1); // 2nd parameter means remove one item only
}
}
}
this.setState((prevState) => ({
checkedItems: prevState.checkedItems.set(item, isChecked),
}));
console.log("Duplicated array");
console.log(this.state.checkedArrays);
var uniqueArray = Array.from(new Set(this.state.checkedArrays));
console.log("Unique array");
console.log(uniqueArray);
}
render() {
return (
<div className="row float-center d-flex justify-content-center">
{checkboxes.map((item, index) => (
<label key={item.key} className="m-3">
<Checkbox
name={Object.keys(item.name)[0]}
index={index}
checked={this.state.checkedItems.get(Object.keys(item.name)[0])}
onChange={this.handleChange}
/>
{Object.keys(item.name)[0]}
</label>
))}
</div>
);
}
}
2nd update based on the requirements
import React from "react";
const Checkbox = ({
type = "checkbox",
name,
index,
checked = false,
onChange,
}) => (
<input
type={type}
name={name}
data-index={index}
checked={checked}
onChange={onChange}
/>
);
const checkboxes = [
{
id: "31",
category: "englsh",
projects: [
{
id: "9",
title: "This is the title for id 9",
description: "This is description for id 9",
},
],
},
{
id: "32",
category: "maths",
projects: [
{
id: "2",
title: "This is the title for id 2",
description: "This is description for id 2",
},
],
},
{
id: "33",
category: "marketing",
projects: [
{
id: "2",
title: "This is the title for id 2",
description: "This is description for id 2",
},
],
},
{
id: "34",
category: "physics",
projects: [
{
id: "2",
title: "This is the title for id 2",
description: "This is description for id 2",
},
],
},
{
id: "35",
category: "media",
projects: [
{
id: "2",
title: "This is the title for id 2",
description: "This is description for id 2",
},
{
id: "10",
title: "This is the title for id 10",
description: "This is description for id 10",
},
],
},
{
id: "36",
category: "science",
projects: [
{
id: "9",
title: "This is the title for id 9",
description: "This is description for id 9",
},
{
id: "11",
title: "This is the title for id 11",
description: "This is description for id 11",
},
],
},
];
export default class App extends React.Component {
constructor(props) {
super(props);
this.state = {
checkedItems: new Map(),
checkedArrays: [],
};
this.handleChange = this.handleChange.bind(this);
}
handleChange(e) {
const item = e.target.name;
const isChecked = e.target.checked;
let value = Object.values(checkboxes[e.target.dataset.index].projects);
console.log(isChecked);
console.log(item);
var len = value.length;
if (isChecked) {
for (var i = 0; i < len; i++) {
this.state.checkedArrays.push(value[i]);
}
} else {
for (var i = 0; i < len; i++) {
let index = this.state.checkedArrays.findIndex(
(x) => x.id === value[i].id
);
if (index > -1) {
this.state.checkedArrays.splice(index, 1); // 2nd parameter means remove one item only
}
}
}
this.setState((prevState) => ({
checkedItems: prevState.checkedItems.set(item, isChecked),
}));
console.log("Duplicated array");
console.log(this.state.checkedArrays);
var uniqueArray = this.state.checkedArrays.filter(function (elem) {
return !this[elem.id] && (this[elem.id] = true);
}, Object.create(null));
console.log("Unique array");
console.log(uniqueArray);
}
render() {
return (
<div className="row float-center d-flex justify-content-center">
{checkboxes.map((item, index) => (
<label key={item.id} className="m-3">
<Checkbox
name={item.category}
index={index}
checked={this.state.checkedItems.get(item.category)}
onChange={this.handleChange}
/>
{item.category}
</label>
))}
</div>
);
}
}