通过比较数组项从数组中删除项

时间:2017-07-10 13:05:24

标签: javascript arrays

输入数组:

[ “温度/ 1 /休闲/空”, “temp / 1 / Lounge / 66,66,66,66,66,66,66,66,64,64,64,64 ......,64,64,64,64,64,64,64”,“temp / 2 /休闲/空”, “温度/ 3 /休闲/空”]

我有一个如上所示的元素数组。 每个项目有四个部分由('/')分隔。 如果前三个部分相同而第四个部分对于任何两个项目是不同的。我想删除第四部分为“空”的项目。

实施例: 如果元素的第四部分在一个项目中有“空”,而在另一个元素中有一些数据,如66,64,...,64,64,64。 我想删除数组中第四部分为'empty'的项目。

我想要输出如下:

[“温度/ 1 /休闲/ 66,66,66,66,66,66,66,66,64,64,64,64 ...,64,64,64,64,64,64 ,64" , “温度/ 2 /休闲/空”, “温度/ 3 /休闲/空”]

我试图拆分数组项目:

for(i=0;i<arr.length;i++){
   stringType = message.split('/')[0];
   day = message.split('/')[1] ; //day
   room = message.split('/')[2] ; 
   settingData = message.split('/')[3] ;
}

请帮我比较项目并从数组中删除。

2 个答案:

答案 0 :(得分:0)

您可以使用此代码。它完美地满足您的需求

defmodule User do
  defstruct name: nil, errors: %{}

  def new(opts) do
    __struct__(__MODULE__, opts) |> validate
  end

  defp validate(user) do
    if !user.name, do: add_error(user, :name, "Name is required"), else: user
  end

  defp add_error(user, property, message) do
    %User{user | errors: Map.put(user.errors, property, message }
  end

  def valid?(user) do
    Enum.empty?(user.errors)
  end
end

您可以看到 ClientScriptManager cs = Page.ClientScript; StringBuilder csText = new StringBuilder(); csText.Append("<script type=\"text/javascript\"> "); csText.Append("result1=Add(x,y);"); csText.Append("result2=Add(result1,b);"); csText.Append("</script>"); cs.RegisterClientScriptBlock(csType, csName, csText.ToString()); 数组是var resultData = ["temp/1/Lounge/empty", "temp/1/Lounge/66,66,66,66,66,66,66,66,64,64,64,64…,64,64,64,64,64,64,64", "temp/2/Lounge/empty","temp/3/Lounge/empty"]; var data = resultData; for(var i=0; i<data.length; i++){ var iItem = data[i]; var iFirst = iItem.substring(0, iItem.lastIndexOf("/") + 1); var iLast = iItem.substring(iItem.lastIndexOf("/") + 1, iItem.length); for(j=i+1 ; j<data.length; j++){ var jItem = data[j]; var jFirst = jItem.substring(0, jItem.lastIndexOf("/") + 1); var jLast = jItem.substring(jItem.lastIndexOf("/") + 1, jItem.length); if(iFirst === jFirst && iLast==='empty'){ resultData.splice(i,1); } } } console.log(resultData);数组的精确副本,以便在从中拼接元素时保持正确的循环。为了进一步解决并尝试长数组值,这里是工作JSFIDDLE

的链接

答案 1 :(得分:0)

您可以按照以下方式执行此操作:

  • 首先,为哈希映射中的每个数组值存储&#34; 4 th 值&#34;它有;
  • 接下来,过滤数组并显式删除4 th 为空的的数组值,还有其他4个 th 值(我们可以在创建的哈希映射中检查这个。)

&#13;
&#13;
function splitValue(value, ignoreCase) {
  let split = value.split('/'),
      key = split.slice(0, 3).join('/'),
      val = split.slice(3).join('/');
  if (ignoreCase) {
    key = key.toLowerCase();
  }
  return [key, val];
}

function filter(arr, ignoreCase = false) {
  var byKey = {};
  for (let value of arr) {
    let [key, val] = splitValue(value, ignoreCase);
    if (!byKey.hasOwnProperty(key)) {
      byKey[key] = [];
    }
    if (val !== 'empty') {
      byKey[key].push(val);
    }
  }
  return arr.filter((value) => {
    let [key, val] = splitValue(value, ignoreCase);
    return (val !== 'empty' || byKey[key].length === 0);
  });
}

console.log(filter([
  "temp/1/Lounge/empty",
  "temp/1/Lounge/something",
  "temp/2/Lounge/empty",
  "temp/3/Lounge/empty"]));

console.log(filter([
  "temp/1/Lounge/something",
  "temp/3/kitchen/something",
  "temp/1/Lounge/empty",
  "temp/3/Kitchen/empty"]));

console.log(filter([
  "temp/1/Lounge/something",
  "temp/3/kitchen/something",
  "temp/1/Lounge/empty",
  "temp/3/Kitchen/empty"], true));
&#13;
.as-console-wrapper {
  max-height: 100% !important;
}
&#13;
&#13;
&#13;

我还在上面的示例中演示了如何忽略字母大小写,以便temp/3/kitchen/...temp/3/Kitchen/...被视为属于同一组。