[英]How to check a set of object is exist in another array object by jQuery
My array, stored in variable named data
: 我的数组,存储在变量命名
data
:
var data = [
{
"name": "username",
"value": null,
"schema": {
"version": 1,
"name": "form.text"
}
},
{
"name": "password",
"value": null,
"schema": {
"version": 1,
"name": "form.text"
}
},
{
"name": "gender",
"value": "other",
"schema": {
"version": 1,
"value_type": "string",
"name": "form.select",
"choices": [
{
"value": "male",
"label": "Male"
},
{
"value": "female",
"label": "Female"
},
{
"value": "other",
"label": "Other"
}
]
}
},
{
"name": "country",
"value": "3",
"schema": {
"version": 1,
"value_type": "string",
"name": "form.select",
"choices": [
{
"value": "1",
"label": "Australia"
},
{
"value": "2",
"label": "USA"
},
{
"value": "3",
"label": "UK"
}
]
}
},
{
"name": "decision",
"value": "not sure",
"schema": {
"version": 1,
"value_type": "string",
"name": "form.text",
"choices": [
{
"value": "yes",
"label": "Yes"
},
{
"value": "no",
"label": "No"
},
{
"value": "not sure",
"label": "I am not sure"
}
]
}
},
{
"name": "hobby",
"value": "['book', 'movie']",
"schema": {
"version": 1,
"value_type": "string",
"name": "form.text",
"choices": [
{
"value": "travel",
"label": "Traveling"
},
{
"value": "book",
"label": "Reading"
},
{
"value": "movie",
"label": "Watching Movie"
}
]
}
},
{
"name": "privacy",
"value": null,
"schema": {
"version": 1,
"name": "form.text"
}
},
{
"name": "message",
"value": null,
"schema": {
"version": 1,
"name": "form.text"
}
}
]
My object, stored in variable named formObj
: 我的对象,存储在名为
formObj
变量中:
var formObj = {
username: {
value: null,
type: 'text',
label: 'Username',
placeholder: 'Enter username',
position: 'left',
block: 'firstRow',
order: 1,
additionalClass: 'user'
},
password: {
value: null,
type: 'password',
label: 'Password',
placeholder: 'enter password',
position: 'left',
block: 'firstRow',
order: 2
},
country: {
value: '3',
type: 'select',
label: 'Where are you form?',
//defaultText: 'Choose here',
position: 'right',
block: 'firstRow',
order: 2,
option: [{
value: '1',
label: 'Australia'
},
{
value: '2',
label: 'USA'
},
{
value: '3',
label: 'UK'
}
]
},
gender: {
value: 'female',
type: 'select',
label: 'Gender',
defaultText: null,
position: 'right',
block: 'firstRow',
order: 1,
option: [{
value: 'male',
label: 'Male'
},
{
value: 'female',
label: 'Female'
},
{
value: 'other',
label: 'Other',
additionalAttr: 'disabled'
}
]
},
decision: {
value: 'not sure',
type: 'radio',
label: 'Have you enjoyed it?',
position: 'left',
block: 'secondRow',
order: 1,
option: [{
value: 'yes',
label: 'Yes',
additionalAttr: 'disabled'
},
{
value: 'no',
label: 'No',
},
{
value: 'not sure',
label: 'I am not sure',
}
]
},
message: {
value: null,
type: 'textarea',
label: 'Message',
placeholder: 'type your message',
position: 'right',
block: 'secondRow',
order: 2,
},
vehicle: {
value: 'car',
type: 'checkbox',
label: 'Preferred vehicles',
position: 'left',
block: 'secondRow',
order: 2,
option: [{
value: 'car',
label: 'I like car'
},
{
value: 'bike',
label: 'I prefer bike'
},
{
value: 'boat',
label: 'Boat is my favorit'
}
]
},
hobby: {
value: ['book', 'movie'],
type: 'checkbox',
label: 'Hobbies',
position: 'left',
block: 'secondRow',
order: 3,
option: [{
value: 'travel',
label: 'Traveling'
},
{
value: 'book',
label: 'Reading'
},
{
value: 'movie',
label: 'Watching movie'
}
]
},
privacy: {
value: null,
type: 'checkbox',
label: 'Privacy',
position: 'right',
block: 'secondRow',
order: 3,
option: [{
value: 'agree',
label: 'I agree'
}
]
},
email: {
value: null,
type: 'text',
label: 'Email',
placeholder: 'Enter email',
position: 'right',
block: 'secondRow',
order: 1,
additionalAttr: 'disabled',
additionalClass: 'emailbox custom'
}
}
So, there are 8 objects
in the data
(array) and 10 objects
in the formObj
(object). 因此,
data
(数组)中有8 objects
10 objects
, formObj
(对象)中有10 objects
。
My target is matching the name
from data
with formObj
, and create new object with the matched object only. 我的目标是使用
formObj
匹配data
的name
,并仅使用匹配的对象创建新对象。 All the value
of the new object should come from the data
(array). 新对象的所有
value
都应来自data
(数组)。 In short, create a newObj
like/from formObj
. 简而言之,从
formObj
创建一个newObj
/ formObj
。 newObj
will not contain the object which are not in the data
(array). newObj
不包含不在data
(数组)中的对象。
I have tried to write the concept here just, but don't understand how to go ahead: 我试着在这里写这个概念,但不明白如何继续:
for (var i = 0; i < data.length; i++) {
if (data[i].name === formObj[key]) {
newObj = formObj; // take only those from formObj which exist in data
newObj[option] = data[schema][choices]; // take the option from choices
newObj[value] = data[value]; // take the value from value
}
}
So, the newObj
will be: 所以,
newObj
将是:
var newObj = {
username: {
value: null,
type: 'text',
label: 'Username',
placeholder: 'Enter username',
position: 'left',
block: 'firstRow',
order: 1,
additionalClass: 'user'
},
password: {
value: null,
type: 'password',
label: 'Password',
placeholder: 'enter password',
position: 'left',
block: 'firstRow',
order: 2
},
country: {
value: '3',
type: 'select',
label: 'Where are you form?',
//defaultText: 'Choose here',
position: 'right',
block: 'firstRow',
order: 2,
option: [{
value: '1',
label: 'Australia'
},
{
value: '2',
label: 'USA'
},
{
value: '3',
label: 'UK'
}
]
},
gender: {
value: 'other',
type: 'select',
label: 'Gender',
defaultText: null,
position: 'right',
block: 'firstRow',
order: 1,
option: [{
value: 'male',
label: 'Male'
},
{
value: 'female',
label: 'Female'
},
{
value: 'other',
label: 'Other',
additionalAttr: 'disabled'
}
]
},
decision: {
value: 'not sure',
type: 'radio',
label: 'Have you enjoyed it?',
position: 'left',
block: 'secondRow',
order: 1,
option: [{
value: 'yes',
label: 'Yes',
additionalAttr: 'disabled'
},
{
value: 'no',
label: 'No',
},
{
value: 'not sure',
label: 'I am not sure',
}
]
},
message: {
value: null,
type: 'textarea',
label: 'Message',
placeholder: 'type your message',
position: 'right',
block: 'secondRow',
order: 2,
},
hobby: {
value: ['book', 'movie'],
type: 'checkbox',
label: 'Hobbies',
position: 'left',
block: 'secondRow',
order: 3,
option: [{
value: 'travel',
label: 'Traveling'
},
{
value: 'book',
label: 'Reading'
},
{
value: 'movie',
label: 'Watching movie'
}
]
},
privacy: {
value: null,
type: 'checkbox',
label: 'Privacy',
position: 'right',
block: 'secondRow',
order: 3,
option: [{
value: 'agree',
label: 'I agree'
}
]
}
}
My working code: 我的工作代码:
$.ajax({ url: "https://api.myjson.com/bins/151f9r", method: "GET" }) .done(function(response) { var data = response.fieldset; console.log('.......................'); console.log(data); }) .fail(function(response) { console.log(response); }); var formObj = { username: { value: null, type: 'text', label: 'Username', placeholder: 'Enter username', position: 'left', block: 'firstRow', order: 1, additionalClass: 'user' }, password: { value: null, type: 'password', label: 'Password', placeholder: 'enter password', position: 'left', block: 'firstRow', order: 2 }, country: { value: '3', type: 'select', label: 'Where are you form?', //defaultText: 'Choose here', position: 'right', block: 'firstRow', order: 2, option: [{ value: '1', label: 'Australia' }, { value: '2', label: 'USA' }, { value: '3', label: 'UK' } ] }, gender: { value: 'female', type: 'select', label: 'Gender', defaultText: null, position: 'right', block: 'firstRow', order: 1, option: [{ value: 'male', label: 'Male' }, { value: 'female', label: 'Female' }, { value: 'other', label: 'Other', additionalAttr: 'disabled' } ] }, decision: { value: 'not sure', type: 'radio', label: 'Have you enjoyed it?', position: 'left', block: 'secondRow', order: 1, option: [{ value: 'yes', label: 'Yes', additionalAttr: 'disabled' }, { value: 'no', label: 'No', }, { value: 'not sure', label: 'I am not sure', } ] }, message: { value: null, type: 'textarea', label: 'Message', placeholder: 'type your message', position: 'right', block: 'secondRow', order: 2, }, vehicle: { value: 'car', type: 'checkbox', label: 'Preferred vehicles', position: 'left', block: 'secondRow', order: 2, option: [{ value: 'car', label: 'I like car' }, { value: 'bike', label: 'I prefer bike' }, { value: 'boat', label: 'Boat is my favorit' } ] }, hobby: { value: ['book', 'movie'], type: 'checkbox', label: 'Hobbies', position: 'left', block: 'secondRow', order: 3, option: [{ value: 'travel', label: 'Traveling' }, { value: 'book', label: 'Reading' }, { value: 'movie', label: 'Watching movie' } ] }, privacy: { value: null, type: 'checkbox', label: 'Privacy', position: 'right', block: 'secondRow', order: 3, option: [{ value: 'agree', label: 'I agree' } ] }, email: { value: null, type: 'text', label: 'Email', placeholder: 'Enter email', position: 'right', block: 'secondRow', order: 1, additionalAttr: 'disabled', additionalClass: 'emailbox custom' } } console.log(formObj);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
You can use reduce
to loop thru the data
array.Check if the name exist as the key on formObj
using hasOwnProperty
. 您可以使用
reduce
来循环data
数组。使用hasOwnProperty
检查名称是否作为formObj
上的键存在。 If it exist use spread syntax to shallow copy the object and overide the value property. 如果存在则使用扩展语法来浅层复制对象并覆盖value属性。
var data = [{"name":"username","value":null},{"name":"password","value":null},{"name":"gender","value":"other"},{"name":"country","value":"3"},{"name":"decision","value":"not sure"},{"name":"hobby","value":[]},{"name":"privacy","value":null},{"name":"message","value":null}] var formObj = {"username":{"value":null,"type":"text","label":"Username","placeholder":"Enter username","position":"left"},"password":{"value":null,"type":"password","label":"Password","placeholder":"enter password","position":"left"},"gender":{"value":"female","type":"select","label":"Gender","defaultText":null,"position":"right"},"country":{"value":"3","type":"select","label":"Where are you form?","position":"right","block":"firstRow"},"decision":{"value":"not sure","type":"radio","label":"Have you enjoyed it?","position":"left","block":"secondRow"},"email":{"value":null,"type":"text","label":"Email","placeholder":"Enter email","position":"right"},"hobby":{"value":[null,null],"type":"checkbox","label":"Hobbies","position":"left","block":"secondRow"},"privacy":{"value":"","type":"checkbox","label":"Privacy","position":"right","block":"secondRow"},"message":{"value":"","type":"textarea","label":"Message","placeholder":"type your message","position":"right"},"vehicle":{"value":"car","type":"checkbox","label":"Preferred vehicles","position":"left","block":"secondRow"}} var newObj = data.reduce((c, v) => { if (formObj.hasOwnProperty(v.name)) c[v.name] = {...formObj[v.name],value: v.value}; return c; }, {}); console.log(newObj);
A simple approach would be to break this task into three steps: 一个简单的方法是将此任务分为三个步骤:
formObj
into an array via the Object.entries()
method Object.entries()
方法将formObj
的键/值条目formObj
到数组中 formObj
to remove entries that don't have matching name
in data
array formObj
过滤提取的键/值对,以删除data
数组中没有匹配name
条目 newObj
via the reduce()
method, to reduce the array of filtered key/value entries into a single object reduce()
方法构造newObj
,以将过滤的键/值条目数组减少为单个对象 This can be implemented by the following: 这可以通过以下方式实现:
var data = [{"name":"username","value":null},{"name":"password","value":null},{"name":"gender","value":"other"},{"name":"country","value":"3"},{"name":"decision","value":"not sure"},{"name":"hobby","value":[]},{"name":"privacy","value":null},{"name":"message","value":null}] var formObj = {"username":{"value":null,"type":"text","label":"Username","placeholder":"Enter username","position":"left"},"password":{"value":null,"type":"password","label":"Password","placeholder":"enter password","position":"left"},"gender":{"value":"female","type":"select","label":"Gender","defaultText":null,"position":"right"},"country":{"value":"3","type":"select","label":"Where are you form?","position":"right","block":"firstRow"},"decision":{"value":"not sure","type":"radio","label":"Have you enjoyed it?","position":"left","block":"secondRow"},"email":{"value":null,"type":"text","label":"Email","placeholder":"Enter email","position":"right"},"hobby":{"value":[null,null],"type":"checkbox","label":"Hobbies","position":"left","block":"secondRow"},"privacy":{"value":"","type":"checkbox","label":"Privacy","position":"right","block":"secondRow"},"message":{"value":"","type":"textarea","label":"Message","placeholder":"type your message","position":"right"},"vehicle":{"value":"car","type":"checkbox","label":"Preferred vehicles","position":"left","block":"secondRow"}} /* Extract key value entries from input object */ const keyValues = Object.entries(formObj) /* Filter input object entries by existence of name matching key from data array */ const filteredKeyValues = keyValues.filter(([key, value]) => { return data.findIndex(({ name }) => name === key) !== -1; }); /* Construct newObj object from filtered key value entries */ const newObj = filteredKeyValues.reduce((result, [key, value]) => { return { [key] : value, ...result }; }, {}); console.log(newObj)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.