javascript在对象中创建和查找值

时间:2017-04-11 15:14:55

标签: javascript arrays object data-structures filter

我有一个具有以下属性的JavaScript对象

{
  name:"Request",
  data:[1,2,3,4,5,6,7,8,9,10,11,12]
},
{
  name:"Waiting",
  data:[1,2,3,4,5,6,7,8,9,10,11,12]
}

我有一个列表,其中包含状态(名称)和月份(数据:[]) 首先,我想验证具有名称的对象是否为" Request"存在。

如果不存在,请创建一个新对象。  { name:'Request', data:[]}

如果名称已存在,它将检查对象数组中是否存在月份"数据"。如果阵列中没有月份,则必须输入它。 {name:'Request', data:[1]}

4 个答案:

答案 0 :(得分:0)



var list = [{
  name:"Waiting",
  data:[1,2,3,4,5,6,7,8,9,10,11,12]
}]

var request = list.filter(status => status.name == "Request");

if (request.length === 0) list.push({name : "Request", data : [1]});
else if (request[0].data.length === 0) request[0].data.push(1);

console.log(list)




答案 1 :(得分:0)

如果一切顺利,我不完全确定您想要做什么,但下面的代码应该满足您提供的要求。



var objs = [{
  name:"Request",
  data:[1,2,3,4,5,6,7,8,9,10,11,12]
},
{
  name:"Waiting",
  data:[1,2,3,4,5,6,7,8,9,10,11,12]
}];

var month = 25;

var request = null;
// Validate whether the object with the name eg "Request" exists.
var requestExists = objs.some(function (elem) {
  if (elem.name === "Request") {
    request = elem;
    return true;
  }
});
//If it does not exist, create a new object.  { name:'Request', data:[]}.
if(!requestExists) {
  objs.push({name: "Request", data: []});
}
else {
// If the name does exist, check if the month exists in the "data" array. 
// If there is no month in the array you must enter it. {name:'Request', data:[1]}
  if (request.data.indexOf(month) === -1) {
    request.data.push(month);
  }
}

console.log(request);
console.log(objs);




答案 2 :(得分:0)

由于OP的示例必须在遵循某些规则的情况下检查和修复数据结构,因此更通用的方法应该寻找可以由其自身操作(手动提供密钥)的特定消毒剂功能的种类,但也作为reduce方法运行,如果涉及根据多个数据项密钥对数据结构进行计数器检查(如OP的原始示例所提供的“请求”)。

然后解决方案很可能接近下一个提供的解决方案。

Array API Documentation of the Mozilla Developer Network确实为Array.isArrayArray.prototype.findIndex提供了填充

function sanitizeDataList(list, key) {
  var
    indexOfDataItem = list.findIndex(function (dataItem) {
      return (dataItem.name === key);
    }),
    dataItem = list[indexOfDataItem];

  if (!dataItem) {
    list.push(dataItem = {
      name: key
    });
  }
  if (!Array.isArray(dataItem.data) || (dataItem.data.length <= 0)) {
    dataItem.data = [1];
  }
  return list;
}


var
  dataList = [{
    name: "Request_A",
    data: [1,2,3,4,5,6,7,8,9,10,11,12]
  }, {
    name: "Waiting_A",
    data: [1,2,3,4,5,6,7,8,9,10,11,12]
  }/*, {
    name: "Request_B",
    data: [1,2,3,4,5,6,7,8,9,10,11,12]
  }*/, {
    name: "Waiting_B",
    data: []
  }, {
    name: "Request_C"
  }, {
    name: "Waiting_C",
    data: [1]
  }],

  dataItemKeyList = ["Request_A", "Waiting_A", "Request_B", "Waiting_B", "Request_C", "Waiting_C"];


dataList = dataItemKeyList.reduce(sanitizeDataList, dataList);


console.log(dataList);
.as-console-wrapper { max-height: 100%!important; top: 0; }

答案 3 :(得分:-1)

一个简单的解决方案是使用indexOf。你需要它在变量中。

var myarray = [{
       name:"Request",
       data:[1,2,3,4,5,6,7,8,9,10,11,12]
       },
       {name:"Waiting",
       data:[1,2,3,4,5,6,7,8,9,10,11,12]
       
       }];
var myreturn = false;       
for(i = 0; myarray.length > i; i++){
  var data = myarray[i];
  if(data.name == "Request"){
    myreturn = true;
    }
    if (myreturn === true){
     alert('sweet now do some code');
     break;
    }
}

我最初的想法是不正确的,但使用For循环会有效。